Python字典:删除所有以s开头的键

16

我有一个类似于字典的东西

dic = {'s_good': 23, 's_bad': 39, 'good_s': 34}

我想删除所有以's_'开头的键

在这种情况下,前两个将被删除。

是否有更有效的方法来做到这一点?

5个回答

24
for k in dic.keys():
    if k.startswith('s_'):
        del dic[k]

* 编辑 * 现在在 Python 3 中,距离最初的回答已经过去了很多年,keys() 返回一个字典的视图,因此您不能更改字典的大小。

最优雅的解决方案之一是对键进行复制:

for k in list(dic.keys()):
    if k.startswith('s_'):
        del dic[k]

12
但是“del”是首选的方式,而且更快。也就是说,“a={'x': 1}; a.pop('x')”每次循环需要0.286微秒,而“a={'x': 1}; del a['x']”只需要0.178微秒。 - Andrew Dalke
6
不仅如此,它在语义上也更好。del 表示您希望删除条目,而 pop 表示您希望检索它。因此,在这种情况下,我更喜欢使用 del 而不是 pop。 ;) - johndodo
不过,最优雅的解决方案是使用字典推导创建一个没有那些键的新字典。 - user3064538

23
这应该可以做到:
for k in dic.keys():
  if k.startswith('s_'):
    dic.pop(k)

真糟糕,你比我先回答了 - Stack Overflow 只允许我每 3 分钟发布一个答案。 - tekknolagi
4
通常情况下,改变你正在迭代的东西并不是一个好主意——在Python 3中,keys是一个dictview而不是一个列表。 - agf
1
Python2 返回一个字典键的副本,我们在其上进行迭代,因此不会改变容器。Python3 返回一个 dictview,它是一个惰性序列,可以看到底层字典中的更改,因此除非将 'dic.keys()' 更改为 'list(dic.keys())',否则这将无法工作。 - Spaceghost
为什么这样做是错误的?应该使用 for k in dic.keys(): 而不是 for k in dic: - tqjustc
1
我想撤销我的投票,因为在Python 3中,对于参数.keys()中的键,会出现RuntimeError: dictionary changed size during iteration。 - Sérgio

11

使用Python 3可以避免这个错误:

RuntimeError: dictionary changed size during iteration 

这应该可以做到:

list_keys = list(dic.keys())
for k in list_keys:
  if k.startswith('s_'):
    dic.pop(k)

9
你可以使用一个 字典推导式
dic = {k: v for k, v in dic.items() if not k.startswith("s_")}

请注意,这将创建一个新的字典(您随后将其分配回 dic 变量),而不是改变现有的字典。

6
像这样怎么样:
dic = dict( [(x,y) for x,y in dic.items() if not x.startswith('s_')] )

1
这并不会从字典中删除键。相反,它会创建一个新的没有这些键的字典。 - nosklo
1
有趣的是,您觉得需要除了提供自己的答案之外还要点踩。我猜吹毛求疵还是很流行的,是吧?我不确定(没有测试过),从现有列表中删除是否比创建新列表实际上更快。那实际上是他的主要问题。 - Peter Rowell
2
我没有给你投反对票,但是(1)@nosklo是正确的,(2)这个单词是“迂腐”,(3)你忘了提到代码在2.x和3.x之间应该有所不同(iteritems vs items),(4)在现代Python中,方括号是多余的,(5)它是否更快将受到以's_'开头的键有多少的影响。 - John Machin
@John Mahin:实际上,“pedantism”这个词是正确的,虽然有点老式。他用了一种卖弄学问的语气说出来 :-)。它是“pedantry”的变体形式。参考http://dictionary.reference.com/browse/pedantism和其他在线资源。 - Peter Rowell

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