如何在python中删除大量字典项

如何在python中删除大量字典项,python,regex,dictionary,Python,Regex,Dictionary,我在python()中有一个大字典,我想删除所有具有某些特征的条目。例如,我想删除元组中第二项等于True,但第三项不等于block的所有条目。我试图用正则表达式来实现这一点,但似乎无法使其正常工作 编辑:我的基本想法是这样做 regex="Regular Expression" for entry in d: if len(re.findall(regex,str(entry)))!=0: del d[entry] print(d) 如果你的字典是用Python编写

我在python()中有一个大字典,我想删除所有具有某些特征的条目。例如,我想删除元组中第二项等于True,但第三项不等于block的所有条目。我试图用正则表达式来实现这一点,但似乎无法使其正常工作

编辑:我的基本想法是这样做

regex="Regular Expression"

for entry in d:
    if len(re.findall(regex,str(entry)))!=0:
        del d[entry]
print(d)

如果你的字典是用Python编写的,我不认为正则表达式是解决这个问题的方法

以下是您的数据示例:

g = {
(0, False, None, 0, False, None):(False,False,True),
(0, True, fire, 0, True, fire):(1/1,1/1,1/1),
(0, True, fire, 0, True, block):(1/1,1/1,1/1),
(0, True, fire, 0, True, reload):(1/1,1/1,1/1),
(0, True, fire, 0, False, fire):(1/1,1/1,1/1),
(0, True, fire, 0, False, block):(1/1,1/1,1/1),
(0, True, fire, 0, False, reload):(1/1,1/1,1/1),
(0, True, fire, 1, True, fire):(1/1,1/1,1/1),
(0, True, fire, 1, True, block):(1/1,1/1,1/1),
(0, True, block, 2, False, reload):(1/1,1/1,1/1),
(0, True, block, 3, True, fire):(1/1,1/1,1/1),
(0, True, block, 3, True, block):(1/1,1/1,1/1),
(0, True, block, 3, True, reload):(1/1,1/1,1/1),
(6, False, reload, 6, True, reload):(1/1,1/1,1/1),
(6, False, reload, 6, False, fire):(1/1,1/1,1/1),
(6, False, reload, 6, False, block):(1/1,1/1,1/1),
(6, False, reload, 6, False, reload):(1/1,1/1,1/1),
}
因此我将使用以下内容,因为列表理解和生成器语句实际上已经取代了Python中的map和filter,现在,对键的第二个元素是
True
,第三个元素不等于
block
,进行过滤:

selected_keys = [i for i in g.keys() if i[1] == True and i[2] != block]
然后,您可以通过筛选的每个键访问dict

例如:

for key in selected_keys:
    print(g[key])

将打印与每个键关联的值。

一种非常简单的方法是

def remove(key, value):
    return key[1] == True and key[2] != block

g = {key:value for key,value in g.iteritems() if not remove(key, value)}
for entry in d.keys():
    if entry[1]==True and entry[2]!=block:
        del d[entry]
在本例中,的循环需要读取keys()方法,因此字典大小的更改不会影响循环


希望有帮助。

一些基本的文本处理将为您提供一个很好的csv,如下所示:

a,b,action1,c,d,action2,e,f,g,h,i,j
0,True,fire,0,True,fire,1,1,1,1,1,1
0,True,fire,0,True,block,1,1,1,1,1,1
0,True,fire,0,True,reload,1,1,1,1,1,1
0,True,fire,0,True,fire,1,1,1,1,1,1
0,True,fire,0,True,block,1,1,1,1,1,1
0,True,fire,0,True,reload,1,1,1,1,1,1
0,True,fire,1,True,fire,1,1,1,1,1,1
0,True,fire,1,True,block,1,1,1,1,1,1
0,True,fire,1,True,reload,1,1,1,1,1,1
0,True,fire,1,True,fire,1,1,1,1,1,1

这可以通过
pandas.read\u csv
读取。显然我的列名是垃圾。一旦我们有了数据帧,我们就可以很容易地按列值对其进行细分。您的查询只是
df[df.b&(df.action1!=“block”)

迭代不起作用吗?当您说“它不起作用”时,您看过
过滤器了吗,你的确切意思是什么?它是抛出了一个错误,还是没有产生期望的结果?在我看来,一个问题是,在从字典中删除时,您正在对字典进行迭代。您可以通过将d:
中的条目的
更改为d.keys()中的条目的
,来解决此问题:
,如回答中所述:。一定要查找pandas。您可以标记这些列,您的查询将类似于
g[(not g.happy)&(g.action!=“block')]