在python中根据条件从字典中删除键

在python中根据条件从字典中删除键,python,list,dictionary,Python,List,Dictionary,我有一个字典列表,在很多文档中,我只想保留3个一组的单词(例如“完成汽车制造”) 过滤后,我想保留前两个基于值的克数,如果值相同,则保留口述中的前两个键 b=[{'america': 0.10640008943905088, 'delete option snapshot': 0.18889748775492732, 'done': 0.10918437741476256, 'done auto manufacturing': 0.18889748775492732, 'done

我有一个字典列表,在很多文档中,我只想保留3个一组的单词(例如“完成汽车制造”) 过滤后,我想保留前两个基于值的克数,如果值相同,则保留口述中的前两个键

b=[{'america': 0.10640008943905088,
  'delete option snapshot': 0.18889748775492732,
  'done': 0.10918437741476256,
  'done auto manufacturing': 0.18889748775492732,
  'done auto delete': 0.18889748775492732,
  'overwhelmed': 0.1714953267142263,
  'overwhelmed sub': 0.18889748775492732,
  'overwhelmed sub value': 0.18889748775492732},
 {'delete': 0.17737631178689198,
  'delete invalid': 0.2918855502796403,
  'delete invalid data': 0.2918855502796403,
  'invalid': 0.19409701271823834,
  'invalid data': 0.2918855502796403,
  'invalid data sir': 0.2918855502796403,
  'nas': 0.14949544719217545,
  'nas server': 0.1632884084021329,
  'nas server replic': 0.2799865687396422}]
输出:

    b=[{'delete option snapshot': 0.18889748775492732,
  'done auto manufacturing': 0.18889748775492732,
  'done auto delete': 0.18889748775492732,
  'overwhelmed sub value': 0.18889748775492732},
 {'delete invalid data': 0.2918855502796403,
  'invalid data sir': 0.2918855502796403}]
我的解决办法:这似乎不对

for i in range(1, len(b)+1):
    for k,v in i.items():
        if len(re.findall(r'\w+',k[i])<3:
               del  b[k]
适用于范围(1,len(b)+1)内的i:
对于i.项()中的k,v:

如果len(re.findall(r'\w+',k[i])使用理解总是好的。因为通常在迭代时不应从列表或dict中删除元素-这是非常糟糕的样式,可能会导致错误。因此最好创建新的dict和列表,并用新列表替换旧列表,以更新我将使用的dict:

{k:v for k,v in d.items if len(v.split(" "))>2}
在本例中,d是dict。现在,您可以简单地使用列表理解更新/重新创建列表:

result = [{k:v for k,v in d.items() if len(k.split(" "))>2} for d in b]

i
是一个数字,因此
i.items()
没有任何意义。因为
i
是列表的索引,它应该是
b[i]。items()

但是您的范围是错误的。列表索引从
0
开始,而不是
1
,因此它应该是
range(0,len(b))
。但是Python提供了一种更简单的方法来迭代列表的所有元素:

for d in b:
因此,要过滤掉键中没有3个单词的所有项目,应该是:

for d in b:
    for k in d:
        if len(re.findall(r'\w+',k)<3:
            del d[k]
对于b中的d:
对于d中的k:
如果len(re.findall(r'\w+',k)尝试


你试过什么?
i.items
应该是
b[i]。items
。但是如果你只是在b:
中为d使用
delb[k]
应该是
delb[i][k]
为什么
范围(1,len(b)+1)
而不是
范围(0,len b))
?您正在跳过第一个词典,并将尝试访问列表之外的内容。@barmar,我是python新手。我将从下次开始处理它。获取错误:
文件“”,第2行结果=[{k:v代表k,v代表d.items(),如果len(re.findall(r'\w+,v)))似乎原始代码中的“全部查找”是错误的,我将对其进行编辑…缺少括号…很好的捕获谢谢…抱歉!错误是()1中的
----------------------------------------------------------------AttributeError Traceback(最近一次调用)导入重新---->2结果=[{k:v代表k,v在d.items()中如果len(re.findall(r'\w+',v)2结果=[{k:v代表k,v在d.items()中如果len(re.findall(r'\w+',v)如果我创建了你的示例变量,那么上面的代码在python中对我有效……让我们来解释一下你所做的区别以及询问者所做的尝试不起作用的原因。简单地粘贴代码并不是一个有用的答案
out = []
for item in b:
    d = dict()
    for key in item.keys():
        if len(key.split())>2:
            d[key] = item[key]
    out.append(d)