python:从混合列表中提取整数
(python 2.7.8) 我想做一个函数,从混合列表中提取整数。混合列表可以是除以下内容以外的任何内容,例如,我将使用:python:从混合列表中提取整数,python,Python,(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
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
问题是,它创建的新列表包含布尔值和整数,这意味着它会得到:
[1, 7, 5, True, False, 7]
为什么呢?我还使用for循环(对于mixedList中的I:if isinstace…),但它本质上是相同的(?)并且有相同的问题。显然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
>>>
您可以使用
type(i)is int
或isinstance(i,int)而不是isinstance(i,bool)
显然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
>>>
您可以使用
type(i)is int
或isinstance(i,int)而不是isinstance(i,bool)
代替isinstance(i,int)
,最好的方法不是使用type
,而是使用一系列isinstance
调用。使用type
的陷阱在于,将来可能有人会将int
子类化,那么您的代码将无法工作。此外,由于使用Python 2 .x,所以需要考虑大于或等于2 ^ 31的数字:这些不是int型的。您需要考虑<代码>长类型:
def parseIntegers(mixedList):
return [x for x in testList if (isinstance(x, int) or isinstance(x, long)) and not isinstance(x, bool)]
<> >需要考虑<代码>长> >:
>>> a = 2 ** 31
>>> isinstance(a, int)
False
最好的方法不是使用
type
,而是使用一系列isinstance
调用。使用type
的陷阱在于,将来可能有人会将int
子类化,那么您的代码将无法工作。此外,由于使用Python 2 .x,所以需要考虑大于或等于2 ^ 31的数字:这些不是int型的。您需要考虑<代码>长类型:
def parseIntegers(mixedList):
return [x for x in testList if (isinstance(x, int) or isinstance(x, long)) and not isinstance(x, bool)]
<> >需要考虑<代码>长> >:
>>> a = 2 ** 31
>>> isinstance(a, int)
False
正如@pts对isinstance所解释的,所以像这样使用
type
[ x for x in testList if type(x)==int ]
输出:
[1, 7, 5, 7]
使用
set
删除重复,如@pts for isinstance所述,因此像这样使用type
[ x for x in testList if type(x)==int ]
输出:
[1, 7, 5, 7]
使用
set
删除重复改用type(i)=int
。小心使用type
-这打破了多态性的概念:如果有人将int
分为子类,您的代码将不再工作。@在这种情况下,他们似乎不希望包含子类。可能是这样-但如果您试图绕过面向对象语言的关键功能(多态性),您最好知道自己在做什么。也许使用类型
是正确的做法。只是要小心。@Smashery这里的问题是bool
是int
的一个子类,它是不需要的,因此在这种情况下,打破isinstance
准则并使用type
是正确的。使用type(i)==int
。小心使用类型
-这打破了多态性的概念:如果有人将int
子类化,您的代码将不再工作。@在这种情况下,他们似乎不希望包含子类。可能是这样-但如果您试图绕过面向对象语言的关键功能(多态性),您最好知道自己在做什么。也许使用类型
是正确的做法。只是要小心。@Smashery这里的问题是bool
是int
的一个子类,它是不需要的,因此在这种情况下,打破isinstance
准则并使用type
是正确的。a=2**31>>isinstance(a,int)True>>type(a)您正在使用Python3吗?这是Python2和Python3之间的一个变化:同时签入Python2和Python3。it samea=2**31>>isinstance(a,int)True>>>type(a)您使用的是Python 3吗?这是Python 2和Python 3之间的一个变化:在Python 2和Python 3中都签入了。是一样的