我正在尝试从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
。我不知道为什么。有人可以告诉我如何做到这一点。优选地是单行(列表理解)。
感谢。
答案 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]]