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

use*_*652 12 python dictionary

我有一本字典

dic = {'s_good': 23, 's_bad': 39, 'good_s': 34}
Run Code Online (Sandbox Code Playgroud)

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

所以在这种情况下,前两个将被删除.

有没有有效的方法呢?

Spa*_*ost 22

这应该这样做:

for k in dic.keys():
  if k.startswith('s_'):
    dic.pop(k)
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,改变你正在迭代的东西并不是一个好主意 - 而在Python 3中,`keys`是一个`dictview`而不是列表. (3认同)

nos*_*klo 18

for k in dic.keys():
    if k.startswith('s_'):
        del dic[k]
Run Code Online (Sandbox Code Playgroud)

  • 但'del'是首选的方式而且速度更快.也就是说,"a = {'x':1}; a.pop('x')"每个循环需要0.286微秒,而"a = {'x':1}; del a ['x']"只需要每个循环0.178微秒. (12认同)
  • 不仅如此,它在语义上也更好.`del`表示您希望删除该条目,而'pop`表示您希望撤消该条目.所以在这种情况下我更喜欢del to pop.;) (6认同)

Sér*_*gio 9

使用python 3避免错误:

RuntimeError: dictionary changed size during iteration 
Run Code Online (Sandbox Code Playgroud)

应该这样做:

list_keys = list(dic.keys())
for k in list_keys:
  if k.startswith('s_'):
    dic.pop(k)
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 7

您可以使用字典理解

dic = {k: v for k, v in dic.items() if not k.startswith("s_")}
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*ell 5

这样的事情怎么样:

dic = dict( [(x,y) for x,y in dic.items() if not x.startswith('s_')] )
Run Code Online (Sandbox Code Playgroud)

  • 我没有投票给你,但是(1)@nosklo是正确的(2)这个词是"pedantry"(3)你没有提到代码应该在2.x和3.x之间不同(iteritems vs items) (4)方括号在现代Python中是多余的(5)它是否更快将受到以's_'开头的键的数量的影响 (2认同)