如何在python中删除大量的字典条目

时间:2014-02-26 02:19:26

标签: python regex dictionary

我在python(https://docs.google.com/document/d/1aNuwIJGRMQA2iSwdT2iliG9Q4Zu2bELNMrQVacEcSdc/edit?usp=sharing)中有一个大字典,我想删除所有具有某些特征的条目。例如,我想删除元组中第二项的所有条目等于True,但第三个不等于block。我试图用正则表达式做这个,但我似乎无法让它工作。

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

regex="Regular Expression"

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

4 个答案:

答案 0 :(得分:0)

如果您的词典实际上是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])

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

答案 1 :(得分:0)

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)}

答案 2 :(得分:0)

这样做的一个非常简单的方法是。

for entry in d.keys():
    if entry[1]==True and entry[2]!=block:
        del d[entry]

在这种情况下,循环需要读取keys()方法,因此对字典大小的更改不会影响循环。

希望它有所帮助。

答案 3 :(得分:0)

一些基本的文本处理会给你一个很好的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_csv阅读。显然我的列名是垃圾。一旦我们有了数据框,我们就可以非常轻松地按列值进行细分。您的查询只是df[df.b & (df.action1 != 'block')