从嵌套列表Python中删除项目

时间:2012-03-23 23:10:28

标签: python python-2.7

我正在尝试从Python中的嵌套列表中删除项目。我有一个嵌套列表如下:

families = [[0, 1, 2],[0, 1, 2, 3],[0, 1, 2, 3, 4],[1, 2, 3, 4, 5],[2, 3, 4, 5, 6]]

我想删除每个子列表中的条目,这些条目与主列表中子列表的索引位置相同。因此,例如,我需要从第一个子列表中删除0,从第二个子列表中删除1,等等。我正在尝试使用列表理解来执行此操作。这就是我的尝试:

familiesNew = [ [ families[i][j] for j in families[i] if i !=j ] for i in range(len(families)) ] 

这适用于range(len(families))最多3个,但除此之外,我得到IndexError: list index out of range。我不知道为什么。有人可以告诉我如何做到这一点。优选地是单行(列表理解)。

感谢。

4 个答案:

答案 0 :(得分:9)

你几乎做对了。只需将families[i][j]替换为j,就可以了:

>>> [ [ j for j in families[i] if i !=j ] for i in range(len(families)) ]
[[1, 2], [0, 2, 3], [0, 1, 3, 4], [1, 2, 4, 5], [2, 3, 5, 6]]

使用enumerate函数可以写得更清晰:

>>> [[f for f in family if f != i] for i, family in enumerate(families)]
[[1, 2], [0, 2, 3], [0, 1, 3, 4], [1, 2, 4, 5], [2, 3, 5, 6]]

如果您不介意更改原始列表,甚至可以使用remove

>>> for i, family in enumerate(families): family.remove(i)

答案 1 :(得分:5)

编辑问题,删除我的答案,解决了错误的问题。另外,@ Ashwini补充了额外的答案:

为了比较:

root# python -m timeit 'families = [[0, 1, 2],[0, 1, 2, 3],[0, 1, 2, 3, 4],[1, 2, 3, 4, 5],[2, 3, 4, 5, 6]]' '[x.remove(ind) for ind,x in enumerate(families) ]'
100000 loops, best of 3: 3.42 usec per loop    

root# python -m timeit -s 'families = [[0, 1, 2],[0, 1, 2, 3],[0, 1, 2, 3, 4],[1, 2, 3, 4, 5],[2, 3, 4, 5, 6]]' '[[f for f in family if f != i] for i, family in enumerate(families)]'
100000 loops, best of 3: 4.87 usec per loop

root# python -m timeit -s 'families = [[0, 1, 2],[0, 1, 2, 3],[0, 1, 2, 3, 4],[1, 2, 3, 4, 5],[2, 3, 4, 5, 6]]' '[ filter(lambda x:x!=i,j) for i,j in enumerate(families) ]'
100000 loops, best of 3: 7.99 usec per loop

这些都是微秒级的,所以我认为无论你想做什么都没关系,除非你打算这么做很多次

答案 2 :(得分:3)

这样做你想要的吗?

familiesNew=[ filter(lambda x:x!=i,j) for i,j in enumerate(families) ]

修改

另请注意,您失败的原因是因为在外部列表的第三个元素([1, 2, 3, 4, 5])您尝试获取for循环中的第五个元素(for j in families[i] == {{ 1}}),但是family [i]的长度为5,意味着最大的索引是4.对不起,如果这个解释有点不清楚......或许以下内容将有助于清除它:

for j in [1,2,3,4,5]

答案 3 :(得分:2)

如果您想修改原始列表,请尝试以下操作:

>>>[x.remove(ind) for ind,x in enumerate(families) ]
>>>families
[[1, 2], [0, 2, 3], [0, 1, 3, 4], [1, 2, 4, 5], [2, 3, 5, 6]]