2014-04-01 24 views
1
def check(temp): 
    for i in temp: 
    if type(i) == str: 
     temp.remove(i) 

temp = ['a', 'b'] 
print(temp) ==> Output: ['a','b'] 
check(temp) 
print(temp) ==> Output: ['b'] 

環路當與需要澄清 - 的Python對於使用列表

溫度=運行[ '一個',1],輸出爲[1]

溫度= [1, 'A', 'b', 'C',2],輸出爲[1, 'b',2]

可能有人關心解釋結果是如何評估..日Thnx

回答

5

要修改的列表中,而迭代它。它會跳過元素,因爲列表在迭代過程中發生變化。使用list.remove()刪除項目也將刪除該元素的第一次出現,因此可能會出現一些意想不到的結果。

從列表中刪除元素的規範的方法是建立一個列表,就像這樣:

>>> def check(temp): 
... return list(x for x in temp if not isinstance(x, str)) 

或者你可以回到常規列表理解:

>>> def check(temp): 
...  return [x for x in temp if not isinstance(x, str)] 

你應該通常用isinstance()而不是type()進行類型測試。例如,type不瞭解繼承。

例子:

>>> check(['a', 'b', 1]) 
[1] 

>>> check([ 1, 'a', 'b', 'c', 2 ]) 
[1, 2] 

>>> check(['a', 'b', 'c', 'd']) 
[] 
+0

+1打我給它 –

+0

@Aशwiniचhaudhary沒有理由,還不如用一個列表理解,我猜我剛剛寫了很多生成器表達式。 – msvalkon

+0

@eryksun一個天真的ipython'%timeit'測試這兩個函數的列表〜200k元素顯示〜3-5 ns的差異。雖然速度較慢,但​​有一半時間似乎過於誇張,除非我的計劃錯誤。 – msvalkon

0

可以使用,

def check(temp): 
    return [i for i in temp if type(i)!=str] 

temp = [ 1, 'a', 'b', 'c', 2 ] 

print check(temp) 

輸出:

[1, 2] 

OR

def check(temp): 
    return [i for i in temp if not isinstance(i, str)] 

temp = [ 1, 'a', 'b', 'c', 2 ,"e",4,5,6,7] 

print check(temp) 

輸出:

[1, 2, 4, 5, 6, 7] 
0
 
>>> text = ['a', 'b', 1, {}] 
>>> filter(lambda x: type(x) == str, text) 
['a', 'b'] 

功能將是這樣的:

 
>>> def check(temp): 
...  return list(filter(lambda x: type(x) == str, temp)) 
... 
>>> check(text) 
['a', 'b']