如何在python中删除大量字典项
我在python()中有一个大字典,我想删除所有具有某些特征的条目。例如,我想删除元组中第二项等于True,但第三项不等于block的所有条目。我试图用正则表达式来实现这一点,但似乎无法使其正常工作 编辑:我的基本想法是这样做如何在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编写
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')]
。