(python 2.7.8)
我正在尝试创建一个从混合列表中提取整数的函数。混合列表可以是除了例如我要去的是:
testList = [1, 4.66, 7, "abc", 5, True, 3.2, False, "Hello", 7]
我认为这很简单,只是写道:
def parseIntegers(mixedList):
newList = [i for i in mixedList if isinstance(i, int)]
return newList
问题是这个创建的newList有布尔值和整数,这意味着它让我:
[1, 7, 5, True, False, 7]
为什么?我也用于循环(对于混合列表中的i:如果是isinstace .....),但它基本上是相同的(?)并且具有相同的问题。
答案 0 :(得分:2)
显然bool是int的子类:
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> isinstance(42, int)
True
>>> isinstance(True, int)
True
>>> isinstance('42', int)
False
>>> isinstance(42, bool)
False
>>>
您可以使用isinstance(i, int)
或type(i) is int
代替isinstance(i, int) and not isinstance(i, bool)
。
答案 1 :(得分:2)
正如@pts针对isinstance所解释的那样,所以请像这样使用type
[ x for x in testList if type(x)==int ]
输出:
[1, 7, 5, 7]
使用set
删除重复
答案 2 :(得分:1)
最好的方法不是使用type
,而是使用isinstance
次调用链。使用type
的缺陷是有人可能在将来继承int
,然后您的代码无法正常工作。此外,由于您使用的是Python 2.x,因此需要考虑大于或等于2 ^ 31的数字:这些不是整数。您需要考虑long
类型:
def parseIntegers(mixedList):
return [x for x in testList if (isinstance(x, int) or isinstance(x, long)) and not isinstance(x, bool)]
需要考虑long
的原因:
>>> a = 2 ** 31
>>> isinstance(a, int)
False
答案 3 :(得分:1)
testList = [1, 4.66, 7, "abc", 5, True, 3.2, False, "Hello", 7]
print([x for x in testList if isinstance(x,int) and not isinstance(x,bool)])
[1, 7, 5, 7]