说我有一份清单清单:
x = [[1,0,0,3],[1,1,1,1],[5,2,0,0],[4,3,0,1],[0,0,0,0]
如何创建仅包含每个列表的非零项的新列表,例如
y = [[1,3],[1,1,1,1],[5,2],[4,3,1],[]]
答案 0 :(得分:5)
In [23]: x = [[1,0,0,3],[1,1,1,1],[5,2,0,0],[4,3,0,1],[0,0,0,0]]
In [24]: y = [[el for el in l if el != 0] for l in x]
In [25]: y
Out[25]: [[1, 3], [1, 1, 1, 1], [5, 2], [4, 3, 1], []]
可替换地,
In [28]: [filter(None, l) for l in x]
Out[28]: [[1, 3], [1, 1, 1, 1], [5, 2], [4, 3, 1], []]
或使用functools
:
In [32]: map(functools.partial(filter, None), x)
Out[32]: [[1, 3], [1, 1, 1, 1], [5, 2], [4, 3, 1], []]
答案 1 :(得分:2)
>>> [[i for i in j if i] for j in x]
[[1, 3], [1, 1, 1, 1], [5, 2], [4, 3, 1], []]
另外,请注意,我认为整数int
只有在false
等于0
且true
时才会被提升为0
这一事实。它们不等于if i != 0
。值得考虑的是,使用if i
代替{{1}}是否明智,因为前者更明确,因此更像Pythonic。
答案 2 :(得分:1)
您可以filter
列表:
y = map(lambda l: filter(None, l), x)
或者您可以使用partial
:
from functools import partial
y = map(partial(filter, None), x)
答案 3 :(得分:0)
x = [[1,0,0,3],[1,1,1,1],[5,2,0,0],[4,3,0,1],[0,0,0,0]]
print x
print 'id(x) ==',id(x)
for sublist in x:
print map(id,sublist)
for sublist in x:
for i in xrange(len(sublist)-1,-1,-1):
if sublist[i]==0:
del sublist[i]
print
print x
print 'id(x) ==',id(x)
for sublist in x:
print map(id,sublist)
使用此代码,您实际上无需创建另一个列表即可清除原始列表中的零,也就是说此代码在x
打印 id(x)和地图(id,子列表)以显示此修改方式:
身份,也就是说,子列表中的元素(对于剩下的元素)以及列表x
本身的地址在处理之前和之后是相同的
如果列表很大,可能会对其进行修改感兴趣 如果不是这种情况,您可以使用其他所有创建新列表对象的解决方案。
由于xrange(len(sublist)-1,-1,-1)
,索引以相反的方式运行,因为如果从左到右探索列表,则会产生错误的结果
结果
[[1, 0, 0, 3], [1, 1, 1, 1], [5, 2, 0, 0], [4, 3, 0, 1], [0, 0, 0, 0]]
id(x) == 18725984
[10021864, 10021876, 10021876, 10021840]
[10021864, 10021864, 10021864, 10021864]
[10021816, 10021852, 10021876, 10021876]
[10021828, 10021840, 10021876, 10021864]
[10021876, 10021876, 10021876, 10021876]
[[1, 3], [1, 1, 1, 1], [5, 2], [4, 3, 1], []]
id(x) == 18725984
[10021864, 10021840]
[10021864, 10021864, 10021864, 10021864]
[10021816, 10021852]
[10021828, 10021840, 10021864]
[]