【发布时间】:2019-03-13 08:05:45
【问题描述】:
我有一些共享键的字典,例如
dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : -3, 'c' : 3}
我想对两者都执行条件操作,但只更改满足条件的键的值。例如,我想将 10 添加到任何具有负值的键“b”,这将产生:
dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : 7, 'c' : 3}
有没有办法循环遍历字典共有的“键”并且只对这些键进行操作?例如
dicts = [dict1, dict2]
for i in dicts:
if i['b'] < 0:
i['b'] = i['b'] + 10
但这会产生以下有趣的结果:
print dicts[0]
print dicts[1]
{'a': 1, 'c': -1, 'b': 12}
{'a': -1, 'c': 3, 'b': -3}
我不确定我是否理解。
我有很多 (1000s) 对这种结构在循环中生成,所以如果可能的话,我希望它相当高效。
谢谢!
编辑:
公认的解决方案
for key in set(dict1).intersection(set(dict2)):
for i in dicts:
if i[key] < 0:
i[key] = i[key] + 10
非常适合 2 个字典。但是,如果我最初有所有相似的“n”个字典,例如对于 4 个字典:
dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : -3, 'c' : 3}
dict3 = {'a' : 1, 'b': -1, 'c' : -4}
dict4 = {'a' : 0, 'b': 5, 'c' : 2}
dicts = [dict1, dict2, dict3, dict4]
而期望的结果(仅将 10 加到所有否定的 'b' 上)将是:
dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : 7, 'c' : 3}
dict3 = {'a' : 1, 'b': 9, 'c' : -4}
dict4 = {'a' : 0, 'b': 5, 'c' : 2}
同样的循环结构是否仍然适用?
【问题讨论】:
-
我无法重现您所看到的内容(在 Python 3 上),我只看到第二个字典发生了变化,这正是您想要的。
-
无法在 Python 2.7 或 3.4.5 下重现您的问题
-
这是 Jupyter Notebook 中的 Python 2.7,无法解释为什么您没有看到我所看到的...
-
虽然您的代码确实像其他人所说的那样工作,但这不是您应该这样做的方式。如果你现在改变
i然后dict2也会改变,他们是同一个字典
标签: python dictionary if-statement conditional