能否在列表推导式中保存迭代变量值并实现字典关联列表合并?
列表推导式实现字典关联更新需求
问题
有没有办法在列表推导式中保存迭代变量的值?
以这个字典为例:
d = { 1: ["a", "b"], 2: ["c", "d"], 3: ["e", 1] }
想要实现的逻辑是:遍历字典的每个键i,如果i存在于任意值列表中,就将i对应的值列表添加到包含i的那个值列表里。用普通循环的逻辑示意如下:
for i in d: if any(i in j for j in d.values()): # 将i对应的值列表添加到包含i的那个列表中
执行后期望字典变为:
d = { 1: ["a", "b"], 2: ["c", "d"], 3: ["e", 1, "a", "b"] }
已知嵌套for循环可以实现,能否通过列表推导式完成这个需求?
解答
可以通过字典推导式结合列表推导式直接实现,不需要额外预处理步骤,代码简洁且符合需求:
d = { k: v + [item for i in v if i in d for item in d[i]] for k, v in d.items() }
逻辑说明
- 外层是字典推导式,遍历原字典的每个键值对
(k, v); - 内层的列表推导式
[item for i in v if i in d for item in d[i]]:- 遍历当前值列表
v中的每个元素i; - 判断
i是否是原字典的键(确保d[i]存在); - 如果是,就把
d[i]中的所有元素展开添加到新列表中;
- 遍历当前值列表
- 最后将原列表
v和生成的追加列表拼接,作为新字典中键k对应的值。
执行这段代码后,原字典会直接更新为期望的结果:键3的值列表会追加键1对应的["a", "b"],其他键的值保持不变。
内容的提问来源于stack exchange,提问作者Marko
相关产品推荐
相关产品推荐

