リストのリストがあるとします:
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], []]
>>> [[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
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)
このコードを使用すると、別のリストを作成することなく、最初のリストからゼロを実際に削除できます。つまり、このコードは次の場所で機能します。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]
[]