Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:从混合列表中提取整数_Python - Fatal编程技术网

python:从混合列表中提取整数

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

(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
问题是,它创建的新列表包含布尔值和整数,这意味着它会得到:

[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中都签入了。是一样的