我在删除字符串和整数列表中的字符串时遇到了一些麻烦。这可能看起来很愚蠢,但这是真的:
>>> 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 :(得分: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'
。
列表理解是这种情况的最佳选择。