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中如何优雅地进行字典组合操作?

16 回复

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)

上条去掉“任务”

都是瞎弄~~~高手都是一行代码完成任务的…

不过这些真的不是很难,你是不是应该找本基础点的教材过一道啊,其实也不花很多时间,几个星期就行了.

带着问题学习 效率高点

回到顶部