我试图从Python中的嵌套列表中删除项目.我有一个嵌套列表如下:
families = [[0, 1, 2],[0, 1, 2, 3],[0, 1, 2, 3, 4],[1, 2, 3, 4, 5],[2, 3, 4, 5, 6]]
Run Code Online (Sandbox Code Playgroud)
我想删除每个子列表中的条目,这些条目与主列表中子列表的索引位置相同.因此,例如,我需要从第一个子列表中删除0,从第二个子列表中删除1,等等.我正在尝试使用列表理解来执行此操作.这是我尝试过的:
familiesNew = [ [ families[i][j] for j in families[i] if i !=j ] for i in range(len(families)) ]
Run Code Online (Sandbox Code Playgroud)
这适用于range(len(families))最多3个,但超出了我的范围IndexError: list index out of range.我不知道为什么.有人可以告诉我如何做到这一点.优选地是单行(列表理解).
谢谢.
Nik*_* B. 10
你几乎做对了.只需更换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]]
Run Code Online (Sandbox Code Playgroud)
使用该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]]
Run Code Online (Sandbox Code Playgroud)
remove如果您不介意更改原始列表,甚至可以使用:
>>> for i, family in enumerate(families): family.remove(i)
Run Code Online (Sandbox Code Playgroud)
编辑问题,删除我的答案,解决了错误的问题.另外,@ 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
Run Code Online (Sandbox Code Playgroud)
这些是微秒,所以我认为你想要做的事情很好,除非你要做很多次.