我有一个由列表组成的字典,例如
mydict={}
mydict['a']=[1,0,0,0,1,1,1,1,1,0,0]
mydict['b']=[2,4,5,6,8,7,5,4,5,6,7]
mydict['c']=[4,5,6,4,6,8,4,3,5,8,7]
现在说如果在'a'中值为0,我想从libraby中的每个列表中删除带有该索引的项目。因此,对于从'a'中删除0的前0,从'b'中删除4,从'c'中删除5,第二个0:0来自'a',5来自'b',6来自'c'等。
我一直试图以多种不同的方式做到这一点,但我无法找到正确的方法。有谁知道如何做到这一点?太棒了!
答案 0 :(得分:4)
>>> import itertools
>>>
>>> mydict={}
>>> mydict['a']=[1,0,0,0,1,1,1,1,1,0,0]
>>> mydict['b']=[2,4,5,6,8,7,5,4,5,6,7]
>>> mydict['c']=[4,5,6,4,6,8,4,3,5,8,7]
>>> # ^ ^ ^ ^ ^ ^
>>> mask = mydict['a']
>>> for key, value in mydict.items():
... mydict[key] = list(itertools.compress(value, mask))
...
>>> mydict
{'a': [1, 1, 1, 1, 1, 1], 'c': [4, 6, 8, 4, 3, 5], 'b': [2, 8, 7, 5, 4, 5]}
答案 1 :(得分:0)
简单循环方法:
index = mydict['a'].index(0)
for value in mydict.values():
del value[index]
但只删除了一个项目。
对于多个项目:
indices = {i for i, v in enumerate(mydict['a']) if v == 0}
mydict = {k: [x for i, x in enumerate(v) if i not in indices]
for k, v in mydict.items()}
使用Python 2时使用dictionary.iteritems()
。
使用itertools.compress()
支持任意值:
from itertools import compress
value_to_remove = 0
mask = [v != value_to_remove for v in mydict['a']]
value_to_remove = 0
mydict = {k: list(compress(v, mask)) for k, v in mydict.items()}
答案 2 :(得分:0)
以下是一种可能的解决方案:
mydict={}
mydict['a']=[1,0,0,0,1,1,1,1,1,0,0]
mydict['b']=[2,4,5,6,8,7,5,4,5,6,7]
mydict['c']=[4,5,6,4,6,8,4,3,5,8,7]
toRemove = [i for i,x in enumerate(mydict['a']) if x == 0]
for key in mydict.keys():
mydict[key] = [x for i,x in enumerate(mydict[key]) if i not in toRemove]
print(mydict)
>>>{'a': [1, 1, 1, 1, 1, 1], 'c': [4, 6, 8, 4, 3, 5], 'b': [2, 8, 7, 5, 4, 5]}
假设您还想从0
列表中删除'a'
。如果不添加简单条件会有所帮助。
或者,更简洁但可读性更低的方法:
mydict = {key:[x for i,x in enumerate(value) if i not in indices]
for key, value in mydict.iteritems()}