我在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)
答案 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')
。