从字典内的多个列表中删除具有相同索引的项目

时间:2014-02-08 15:21:11

标签: python dictionary

我有一个由列表组成的字典,例如

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'等。

我一直试图以多种不同的方式做到这一点,但我无法找到正确的方法。有谁知道如何做到这一点?太棒了!

3 个答案:

答案 0 :(得分:4)

使用itertools.compress

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