使用列表生成式从字典中删除Python数据

5
我正在努力成为一名优秀的Python程序员,并尽可能使用列表推导式... 为什么这行代码不起作用?
[del my_dict[r] for r in to_remove]

目标是从字典对象my_dict中删除列表to_remove中的条目。

for r in to_remove:
  del my_dict[r]

功能正常,但我正在尝试使用列表推导来完成它。


5
列表推导式用于从旧列表创建新列表,可能会检查条件。对于您的使用情况,您应该使用循环。 - Some programmer dude
3
@andy boot,为了所有Pythonista的利益,请阅读PEP8 - Zaur Nasibov
5个回答

16

不应该使用列表推导式来产生副作用,这不符合 Python 风格。

应该使用简单的 for 循环来代替。


11

因为del X是一条语句,不应该像那样使用。它在语法上是不正确的。

只需:

for r in to_remove:
    del my_dict[r]

3
+1 这应该是被接受的答案,因为它提到了真正的原因。 - wim

5
  1. 在这里,你并没有从列表推导式中获得任何东西,因为你不需要一个新的列表。
  2. del 不是一个函数,所以你不能在列表推导式的一部分中调用它。

基本上,只需遍历列表即可:

for r in to_remove:
    del my_dict[r]

1

你可以这样做:

[my_dict.pop(r) for r in to_remove]

.pop 返回被删除的键的值,但它可能比del慢一点(见此处),并且不是最“Pythonic”的方法。因此,您可能不应该这样做,正如其他人所建议的那样。


0

可以这样做,但我会听jamylak的建议。当然,这是返回一个新的列表,而不是从my_dict中删除。

my_dict = [x for x in my_dict if x not in to_remove]

这也可以通过集合来完成,例如 set(my_dict.keys()).difference(to_remove) - Zaur Nasibov
我只是给提问者一个选择。我明确提到这不是一个好的方法,而且问题是关于列表推导的。感谢set选项,我以前从未使用过difference函数。 - Aesthete
完全同意,只是评论一下,以防您没有以这种方式使用集合 :) - Zaur Nasibov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接