2013-08-21 36 views
0

我在從字符串和整數列表中只刪除字符串時遇到了一些麻煩。這可能看起來很可笑,卻是真的:如何從列表中刪除所有的某些數據類型?

>>> A = [1, '2', '3', 4, '5', '4', 6, 56, 7, '4', 6, '543'] 
>>> 
>>> for i in A: 
     if type(i) is str: 
        A.remove(i) 


>>> A 
[1, '3', 4, 6, 56, 7, '4', 6] 

沒有任何人有任何想法發生了什麼,或者如果我只是做錯了什麼?

+0

http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating-in-python/1207500#1207500 – Karthikeyan

回答

1

或者,您也可以使用內置的filter功能:

filtered_A = filter(lambda i:not(type(i) is str), A) 
0
In [1]: A = [1, '2', '3', 4, '5', '4', 6, 56, 7, '4', 6, '543'] 

In [2]: [x for x in A if type(x)!=str] 
Out[2]: [1, 4, 6, 56, 7, 6] 
+0

嘿,非常感謝!我甚至沒有想到這一點。 – Plopperzz

0

在列表中循環時刪除元素不起作用。

使用列表理解來代替:

>>> A = [1, '2', '3', 4, '5', '4', 6, 56, 7, '4', 6, '543'] 
>>> [x for x in A if not isinstance(x, str)] 
[1, 4, 6, 56, 7, 6] 
+0

謝謝。有沒有什麼特別的原因,爲什麼一個循環不以這種方式工作? – Plopperzz

+0

如果使用Python 2.x,那麼在這裏'basestring'可能更適合 - 除非包含'unicode' ... –

+0

@Popperzz,如果刪除了一個元素,那麼使用的索引會不同步。 – falsetru

0

不要從列表中刪除元素,你都遍歷,既然你贏了捕捉每一個元素:

A = [1, '2', '3', 4, '5', '4', 6, 56, 7, '4', 6, '543'] 

for i in A: 
    print(repr(i)) 
    if type(i) is str: 
     A.remove(i) 

# 1, '2', 4, '5', 6, 56, 7, '4', '543' 

如果你需要一個顯式循環,co PY名單(見section about for-loop in the tutorial):

for x in A[:]: 
    if isinstance(x, str): 
     A.remove(x) 

在這種情況下,你應該使用list comprehension,雖然。

[x for x in A if isinstance(x, int)] 
0

如果你的目的是隻保留相同數量的對象在列表中,然後可以通過使用作出明確規定:

A = [1, '2', '3', 4, '5', '4', 6, 56, 7, '4', 6, '543'] 

from numbers import Number 
A[:] = [el for el in A if isinstance(el, Number)] 
# [1, 4, 6, 56, 7, 6] 

然後,如果你想縮小特定類型數字(例如,只是個整數),你可以這樣做:

A = [1, 1.0, 1j] 

from numbers import Integral 
A[:] = [el for el in A if isinstance(el, Integral)] 
# [1] 
0

決不改變(尤其是添加或刪除元素)你循環的容器,因爲容器上的迭代器是不會被告知您一個如你所注意到的,這很可能會產生一個非常不同的循環和/或不正確的循環。

就像在這種情況下一樣,要從列表中刪除的第一個元素是'2'。在下一次迭代中,循環將工作於A[2],現在爲4。因此,循環從未跑過元素'3'

列表解析是這種情況下的最佳選擇。

相關問題