如何从列表中删除所有特定数据类型?

时间:2013-08-21 08:44:51

标签: python string list

我在删除字符串和整数列表中的字符串时遇到了一些麻烦。这可能看起来很愚蠢,但这是真的:

>>> 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]

是否有人对发生的事情有任何想法,或者我是否只是做错了什么?

6 个答案:

答案 0 :(得分:3)

或者,您可以使用内置的filter函数:

filtered_A = filter(lambda i:not(type(i) is str), A)

答案 1 :(得分:2)

在列表上循环时删除元素不起作用。

改为使用列表理解:

>>> 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]

答案 2 :(得分: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]

答案 3 :(得分: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'

如果您需要显式循环,请复制列表(请参阅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)]

答案 4 :(得分: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]

答案 5 :(得分:0)

永远不要改变(特别是添加或删除元素)您正在循环的容器,因为该容器上的迭代器不会被告知您的更改,并且正如您所注意到的那样,很可能会产生非常不同的循环和/或不正确的。

在这种情况下,要从列表中删除的第一个元素是'2'。在下一次迭代中,循环将适用于A[2],现在是4。因此,循环从不运行元素'3'

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