繁体   English   中英

在Python中,如何从列表列表中删除某个元素?

[英]In Python, how can I remove a certain element from a list of lists?

说我有一个清单清单:

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],[]]
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], []]

使用list comprehensions

>>> [[i for i in j if i] for j in x]
[[1, 3], [1, 1, 1, 1], [5, 2], [4, 3, 1], []]

另外,请注意,我不赞成这样的事实:整数int仅在等于0时才提升为false ,而在不等于0时才为true 这是值得考虑,如果它是明智的使用if i != 0 ,而不是if i ,因为前者更加明确,从而更符合Python。

您可以filter列表:

y = map(lambda l: filter(None, l), x)

或者您可以使用partial

from functools import partial

y = map(partial(filter, None), x)
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)

使用此代码,您实际上消除了INITIAL列表中的零,而无需创建另一个列表,也就是说,此代码在x中就位

完成id(x)map(id,sublist)的打印以显示这种修改方式:
在处理之前和之后,标识(即,子列表的元素(对于剩余元素)的地址以及列表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]
[]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM