Python中如何嵌套列表与字典推导式实现字典列表端口名替换
问题描述
我现有一个由字典组成的列表,需要修改列表内字典的对应值,目前编写的for loop可正常实现预期功能,代码如下:
show_mac = [{'mac': '0000.0000.0000', 'port': 'GigabitEthernet1/1', 'type': 'dynamic', 'vlan': '1'}, {'mac': '0000.0000.0000', 'port': 'TenGigabitEthernet2/1', 'type': 'dynamic', 'vlan': '1'}, {'mac': '0000.0000.0000', 'port': 'Port-channel1', 'type': 'dynamic', 'vlan': '1'}] for d in show_mac: for k, v in d.items(): d[k] = ( v.replace('TenGigabitEthernet', 'Te') .replace('GigabitEthernet', 'Gi') .replace('Port-channel', 'Po') ) pprint(show_mac)
上述代码运行后输出结果如下:
[{'mac': '0000.0000.0000', 'port': 'Gi1/1', 'type': 'dynamic', 'vlan': '1'}, {'mac': '0000.0000.0000', 'port': 'Te2/1', 'type': 'dynamic', 'vlan': '1'}, {'mac': '0000.0000.0000', 'port': 'Po1', 'type': 'dynamic', 'vlan': '1'}]
我目前正在学习Python推导式的编写方法,想要了解如何使用列表推导式嵌套字典推导式的写法改写上述for loop,得到完全一致的处理结果?
实现方法
直接嵌套两层推导式即可:外层用列表推导式遍历原列表的每个字典,内层用字典推导式遍历单个字典的所有键值对,对值执行和原逻辑完全一致的替换规则,代码如下:
show_mac = [ { k: v.replace('TenGigabitEthernet', 'Te') .replace('GigabitEthernet', 'Gi') .replace('Port-channel', 'Po') for k, v in d.items() } for d in show_mac ] pprint(show_mac)
运行后输出和原逻辑的结果完全匹配。
补充说明
- 两种写法的核心差异:原循环是原地修改原列表里的已有字典对象,不会生成新容器;推导式写法会生成全新的字典、组成全新的列表,再赋值给
show_mac变量,如果你没有其他地方引用原列表/原字典的需求,这个差异不会造成任何影响。 - 所有字段都会统一走替换逻辑,
mac、type、vlan这类本身不包含待替换字符串的字段,执行replace不会改动原值,处理效果和原逻辑完全一致。 - 如果你必须保留原地修改原对象的逻辑,不建议硬套推导式。推导式的定位是生成新容器,强行用推导式写原地修改的逻辑,会产生无意义的临时对象,代码可读性也会变差,不如原循环清晰。
内容的提问来源于stack exchange,提问作者Ryan Bell
相关产品推荐
相关产品推荐

