我有一些共享密钥的字典,例如
dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : -3, 'c' : 3}
我想对两者都执行条件操作,但只更改满足条件的键的值。例如,我想在任何具有负值的键'b'上加10,这样会产生:
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}
我不确定我是否理解。
我有很多(1000)对这种结构在一个循环中生成,所以我希望它在可能的情况下相当有效。
谢谢!
编辑:
可接受的
解决方案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]
(所有负数'b'
仅加10)的期望结果将是:
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}
相同的循环结构是否仍然适用?
答案 0 :(得分:1)
我无法在Python 3中重现您的问题。建议您使用set()
和intersection()
来收集公用密钥:
dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'d' : -1, 'b' : -3, 'e' : 3}
dicts = [dict1, dict2]
for key in set(dict1).intersection(set(dict2)):
for i in dicts:
if i[key] < 0:
i[key] = i[key] + 10
收益:
{'a': 1, 'b': 2, 'c': -1}
{'d': -1, 'b': 7, 'e': 3}
答案 1 :(得分:1)
我无法重现您的问题。但是,由于问题的第二部分考虑了效率,因此建议您尝试字典理解。该算法仍然具有O( n )复杂度,但是在循环中的构造可以更有效地实现:
def num_changer(d, inc=10, k='b'):
return {k: v if (k != 'b') or (v >= 0) else v + 10 for k, v in d.items()}
dict1 = num_changer(dict1)
dict2 = num_changer(dict2)
print(dict1, dict2, sep='\n')
{'a': 1, 'b': 2, 'c': -1}
{'a': -1, 'b': 7, 'c': 3}
答案 2 :(得分:0)
您可以动态创建包含相交键的字典。
for a in set([x for x in dict1 if x in dict2]):
if dict1[a] < 0: dict1[a] += 10
if dict2[a] < 0: dict2[a] += 10
>>> dict1
{'a': 1, 'c': 9, 'b': 2}
>>> dict2
{'a': 9, 'c': 3, 'b': 7}
>>>
但是,对于许多字典,您应该以更具可读性的方式进行操作