あなたのリスト内包にループ代わります。それでもリストは変更されます。他の人が述べたようにx is 0
は0
とFalse
の区別を単純化:このような副作用を
In [106]: al=[0, 1, 2, False, True, 3,0,10]
In [107]: for i,x in enumerate(al):
...: if x is 0:
...: value = al.pop(i)
...: al.append(value)
...:
In [108]: al
Out[108]: [1, 2, False, True, 3, 10, 0, 0]
は、ループが理解よりも優れています。理解は、次の項目で使用する必要があります。
return [.... for x in al if ...]
センス。理解の中で列挙を使用することもできます。
return [fun(x, i) for i, x in enumerate(al) if x...]
明確なリストの理解では、リストは1回だけ表示されます。テストと戻り値は、元のリストではなく、反復変数のみに依存します。
===================
0
とFalse
はしばしば同じように扱われることに注意してください。たとえば、数値を期待する演算では、False
を0
、True
を1と扱います。ブール値を期待する関数は、0
をFalse
として扱います。リスト内包でand
と
In [117]: [x+1 for x in al]
Out[117]: [1, 2, 3, 1, 2, 4, 1, 11]
In [118]: al=[0, 1, 2, False, True, 3,0,10]
In [119]: sum(al)
Out[119]: 17
=================
例:
In [137]: [x for x in al if x==0]
Out[137]: [0, False, 0]
In [138]: [x for x in al if x==0 and x is not False]
Out[138]: [0, 0]
In [140]: [x for x in al if not (x==0 and x is not False)]
Out[140]: [1, 2, False, True, 3, 10]
======== ====
別の可能な試験 - STR表現の:
In [143]: [x for x in al if str(x)!='0']
Out[143]: [1, 2, False, True, 3, 10]
===============
問題はテストではなく、al.index(x)
です。 0
とFalse
の両方に一致しており、どちらがx
であるかにかかわらず、最初のテストを削除します。
al.index(x)
と
バージョン:
def move_zeros(array):
[array.insert(len(array), array.pop(i)) for i,x in enumerate(array) if (x == 0 and x is not False)]
return array
In [403]: al=[1,False,2, 0,3,"b"]
In [404]: move_zeros(al)
Out[404]: [1, False, 2, 3, 'b', 0]
孤立してindex
をテスト:列挙i
In [399]: al=[1,False,2, 0,3,"b"]
In [400]: for i,x in enumerate(al):
...: if x ==0 and x is not False:
...: al.append(al.pop(i))
...:
In [401]: al
Out[401]: [1, False, 2, 3, 'b', 0]
またはあなたの関数で
In [396]: al=[1,False,2, 0,3,"b"]
In [397]: for x in al:
...: if x ==0 and x is not False:
...: al.append(al.pop(al.index(x)))
...:
In [398]: al
Out[398]: [1, 2, 0, 3, 'b', False]
バージョン
In [405]: al=[1,False,2, 0,3,"b"]
In [406]: al.index(0)
Out[406]: 1
In [407]: al.index(False)
Out[407]: 1
例を使って機能が何をしているのか詳しく教えてください。 Btw、insertは値を返さないため、 'None'の配列を作成しています。また、 'array.insert(len(array)、...)'は 'array.append(...)'と同じです。 – ozgur
リスト内包表記を使用する方法を学ぶ必要があります。それは彼らがどのように使われているかではありません。経験則の簡単なルール:リストの理解に副作用がある場合、それは間違っています。 – spectras
問題を与える 'array'の例を追加します。そして、あなたが望む結果。あなたはリストの理解を '返す 'べきであり、理解の中で変更されるリストはありません。 – hpaulj