Python字典:删除所有以s开头的键
我有一本像这样的字典Python字典:删除所有以s开头的键,python,dictionary,Python,Dictionary,我有一本像这样的字典 dic = {'s_good': 23, 's_bad': 39, 'good_s': 34} 我要删除所有以“s”开头的键 因此,在这种情况下,前两个将被删除 有什么有效的方法可以做到这一点吗?这应该可以做到: for k in dic.keys(): if k.startswith('s_'): dic.pop(k) list_keys = list(dic.keys()) for k in list_keys: if k.startswith('s
dic = {'s_good': 23, 's_bad': 39, 'good_s': 34}
我要删除所有以“s”开头的键
因此,在这种情况下,前两个将被删除
有什么有效的方法可以做到这一点吗?这应该可以做到:
for k in dic.keys():
if k.startswith('s_'):
dic.pop(k)
list_keys = list(dic.keys())
for k in list_keys:
if k.startswith('s_'):
dic.pop(k)
像这样的怎么样:
dic = dict( [(x,y) for x,y in dic.items() if not x.startswith('s_')] )
您可以使用:
请注意,这将创建一个新字典(然后将其分配回dic
变量),而不是对现有字典进行变异
for k in dic.keys():
if k.startswith('s_'):
del dic[k]
*编辑*
现在在Python3中,在原始答案出现几年后,keys()
将一个视图返回到dict中,因此您不能更改dict的大小
最优雅的解决方案之一是密钥的副本:
for k in list(dic.keys()):
if k.startswith('s_'):
del dic[k]
使用python 3可避免此错误:
RuntimeError: dictionary changed size during iteration
这应该做到:
for k in dic.keys():
if k.startswith('s_'):
dic.pop(k)
list_keys = list(dic.keys())
for k in list_keys:
if k.startswith('s_'):
dic.pop(k)
该死。请告诉我答案-stachoverflow只允许我每3分钟发布一个答案一般来说,这不是一个好主意,要对您正在迭代的内容进行变异——在Python 3上,
keys
是一个dictview
而不是一个列表。Python2返回我们迭代的字典键的副本,因此我们不会更改容器。Python3返回一个dictview,一个惰性序列,它可以看到底层字典中的更改,因此除非将“dic.keys()”更改为“list(dic.keys()”,否则这将无法工作。为什么这是错误的<代码>对于dic中的k:而不是对于dic中的k.keys():
我想要恢复我的投票,因为在python 3中,对于key-in-parameters.keys():RuntimeError:字典在迭代期间更改了大小,不会从dict中删除键。它创建了一个没有键的新dict,相反,有趣的是,除了提供自己的答案外,你还觉得有必要否决投票。我猜学究主义还活着,嗯?我想知道(没有测试过)从现有列表中删除是否比创建新列表更快。这实际上是他的主要问题。我没有否决你,但是(1)@nosklo是正确的(2)这个词是“迂腐的”(3)你没有提到代码应该在2.x和3.x之间有所不同(iteritems vs items)(4)方括号在现代Python中是多余的(5)它是否更快将受到以“s”开头的按键数量的影响。@John Mahin:事实上,学究主义这个词是正确的,如果有点过时的话,他学究般地说:-)。这是迂腐的一种变体。参考文献和其他在线资源。但“del”是首选方式,而且速度更快。也就是说,“a={'x':1};a.pop('x')”每个循环需要0.286微秒,而“a={'x':1};dela['x']”每个循环只需要0.178微秒。不仅如此,它在语义上也更好del
表示您希望删除该条目,而pop
表示您希望检索该条目。所以在这种情况下,我更喜欢戴尔而不是流行音乐不,最优雅的解决方案是使用dict理解创建一个新的dict,而不使用那些键。