如何检查多个字典中的值,并在满足条件的情况下更改任意/全部

时间:2018-10-08 15:46:12

标签: python dictionary if-statement conditional

我有一些共享密钥的字典,例如

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}

相同的循环结构是否仍然适用?

3 个答案:

答案 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}
>>> 

但是,对于许多字典,您应该以更具可读性的方式进行操作