2013-08-21 35 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'

列表解析是这种情况下的最佳选择。

相关问题