環路替代列表理解。它仍然修改列表。正如其他人指出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...]
在明確的列表理解中,列表只會出現一次;測試和返回值將僅取決於迭代變量,而不取決於原始列表。
===================
要注意的是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)
:
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]
版本並具有枚舉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]
或者在你的函數:
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
:
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
您能詳細說明一下您的函數在做什麼嗎?順便說一句,你正在創建一個'None'的數組,因爲insert不會返回一個值。 'array.insert(len(array),...)'與'array.append(...)'相同。 – ozgur
你應該學會使用列表解析。這不是他們如何使用。快速經驗法則:如果您的列表理解有副作用,那麼您做錯了。 – spectras
添加一個'array'(列表,我假設)給你的問題。你想要什麼結果。你應該「返回」列表理解,而不是在理解中被修改的列表。 – hpaulj