Python中如何优雅地进行字典组合操作?
有一个列表和一个字典
port = [80, 443]
value_port = {‘TX_80’: 0, ‘RX_443’: 0, ‘RX_80’: 0, ‘TX_443’: 0}
如何得出下面的结果?
port_80 = {‘TX_80’: 0, ‘RX_80’: 0}
port_443 = {‘RX_443’: 0, ‘TX_443’: 0}
Python中如何优雅地进行字典组合操作?
result = defaultdict(list)
for k,v in value_port.items():
result[re.search(r"_(\d{1,5})").group(1)].append({k:v})
随手写的,我觉得差不多
在Python里合并字典,最优雅的方式就是用 {**d1, **d2} 或者 d1 | d2(Python 3.9+)。
看个例子就明白了:
# 假设你有两个字典
base_config = {'host': 'localhost', 'port': 8080}
user_config = {'port': 9000, 'debug': True}
# 方法1:字典解包(Python 3.5+)
merged = {**base_config, **user_config}
print(merged) # 输出:{'host': 'localhost', 'port': 9000, 'debug': True}
# 方法2:合并运算符(Python 3.9+)
merged = base_config | user_config
print(merged) # 输出同上
# 如果你想原地更新第一个字典,可以用update
base_config.update(user_config)
print(base_config) # 输出:{'host': 'localhost', 'port': 9000, 'debug': True}
关键点:后面字典的键值会覆盖前面的。{**a, **b} 和 a | b 都会创建新字典,不改变原来的。update() 会直接修改左边的字典。
如果字典很多,可以用循环:
dicts = [dict1, dict2, dict3]
merged = {}
for d in dicts:
merged.update(d)
# 或者用字典推导式
merged = {k: v for d in dicts for k, v in d.items()}
总结:Python 3.9+直接用管道符 | 最清爽。
Python 多个列表如何合并成一个大列表?
/t/409304
LZ 还是要多练习基础哦。
可以根据字符串包含判断
1. 将 port 转成字符串,然后判断是否被包含在某个键中;
2. 或者将键根据下划线拆分,然后判断第二个位置的字符串是不是等于 port 元素的字符串形式。
另外,如果需要动态创建 ‘port_80’ 这种变量的话,可以看一下 locals() 函数。
defaultdicts 是什么?
共同学习
port_80, port_443 = tuple(list(filter(lambda x: x.endswith(str(i)), value_port)) for i in port)
厉害 膜拜大佬 我在看看怎么动态创建 ‘port_80’ 这种变量
没事 有思路就行
哥,怎么又是你~由于我也是新手,最近才学了几个月 python,所以权当自己练习了哈
先感谢你的’感谢’
# 动态生成你要的变量名
port = [80, 443]
new_port = []
for i in port:
new_port.append(‘port_’ + str(i))
print(new_port)
for i in range(len(new_port)):
vars()[new_port[i]] = temp[i]
print(port_80)
print(port_443)
# 简写可以变成
port = [80, 443]
new_port = [‘port_’ + str(i) for i in port]
# 最终结果
port = [80, 443]
value_port = {‘TX_80’: 0, ‘RX_443’: 0, ‘RX_80’: 0, ‘TX_443’: 0}
new_port = [‘port_’ + str(i) for i in port]
temp = []
for i in port:
new_dict = {}
for keys, values in value_port.items():
if str(i) in keys:
new_dict[keys] = values
temp.append(new_dict)
for i in range(len(new_port)):
vars()[new_port[i]] = temp[i]
我只能帮你到这里了,这个把 string 变成变量名的方法我还真不会,stackoverlfow 上面都没有,是临时 google 找出来的.
我看 stackoverflow 上面大多数人是反对这么做的, 觉得这么做很吃力不讨好的感觉? 我是新手也不太懂
补一下,不知道为什么缩进没了…
port = [80, 443]
value_port = {‘TX_80’: 0, ‘RX_443’: 0, ‘RX_80’: 0, ‘TX_443’: 0}
new_port = [‘port_’ + str(i) for i in port]
temp = []
for i in port:
new_dict = {}
for keys, values in value_port.items():
if str(i) in keys:
new_dict[keys] = values
temp.append(new_dict)
for i in range(len(new_port)):
vars()[new_port[i]] = temp[i]
擦,不管怎么整,缩进都被吞没, 用等号代替
port = [80, 443]
value_port = {‘TX_80’: 0, ‘RX_443’: 0, ‘RX_80’: 0, ‘TX_443’: 0}
new_port = [‘port_’ + str(i) for i in port]
temp = []
for i in port:
==new_dict = {}
==for keys, values in value_port.items():
====if str(i) in keys:
======new_dict[keys] = values
==temp.append(new_dict)
for i in range(len(new_port)):
==vars()[new_port[i]] = temp[i]
print(port_80)
print(port_443)
上条去掉“任务”
都是瞎弄~~~高手都是一行代码完成任务的…
不过这些真的不是很难,你是不是应该找本基础点的教材过一道啊,其实也不花很多时间,几个星期就行了.
带着问题学习 效率高点

