Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字典:删除所有以s开头的键_Python_Dictionary - Fatal编程技术网

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,而不使用那些键。