我有一个字典,里面有一个键值对
dct = {'a': 1}
我想在这个字典中添加更多的键值对,所以,我想,
{dct.update(**i) for i in [{'b': 2}, {'c': 3}, {'d': None}] if any(i.values())}
但是IDE开始建议将其转换为变量,并用黄色背景标记上面的行
var = {dct.update(**i) for i in [{'b': 2}, {'c': 3}, {'d': None}] if any(i.values())}
然后我添加了这个变量,但它将不被使用,IDE开始说未使用的变量var
。
如何在IDE没有任何问题的情况下更新字典?
以正常方式执行而不使用集合理解
for i in [{'b': 2}, {'c': 3}, {'d': None}]:
if any(i.values()):
dct.update(**i)
因为您没有在代码中使用结果集。最好保持简单,不要使用任何不必要的理解。
编辑
作为标记建议,如果你有任何值0
,你可以像这个一样
for i in [{'b': 2}, {'c': 3}, {'d': None}]:
if any([v for v in i.values() if v not None])
dct.update(**i)
如果您从键/值对的角度考虑这一点,您可以将dict转换为键/值配对,并将其作为扁平列表传递到更新中:
dct = {'a': 1}
l = [{'b': 2}, {'c': 3}, {'d': None}]
dct.update((k, v) for d in l for k, v in d.items() if v is not None)
print(dct)
# {'a': 1, 'b': 2, 'c': 3}
这与使用any(i.values())
的代码有着微妙的不同,在这种情况下,这些dict中的任何一个都可能具有大于on的值,如:{'e':100, 'd': None}
。使用上面的代码,这将添加e
而不是d
,但使用any
方法,您最终会添加d: None
键值对。
此外,如果任何值可能是0
,请小心构造if any(i.values())
,以确保它具有您期望的行为。
找到了一种实现相同的方法
dct = {i: j for i, j in zip(['a', 'b', 'c', 'd'], [1, 2, 3, None]) if j}
编辑
或者类似的东西,
dct = {'a': 1}
dct.update({i: j for i, j in zip(['b', 'c', 'd'], [2, 3, None]) if j})