在更新字典时避免创建额外的变量



我有一个字典,里面有一个键值对

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})

最新更新