有没有一种方法可以从Python列表中仅输出数字?

19

简单问题:

list_1 = [ 'asdada', 1, 123131.131, 'blaa adaraerada', 0.000001, 34.12451235265, 'stackoverflow is awesome' ]

我想创建一个名为list_2的列表,该列表仅包含数字:

list_2 = [ 1, 123131.131, 0.000001, 34.12451235265 ]

是否有简单的方法来完成这件事,或者我必须检查每个列表项的变量类型并仅输出数值型的项目?


6
为什么这个问题被踩了? - user142019
该死,这时我希望我能选择两个答案。 - dassouki
为什么它现在被投票得这么高?它是这里许多问题的重复! - SilentGhost
10个回答

23
列表推导式。
list_2 = [num for num in list_1 if isinstance(num, (int,float))]

可能值得将类型 long 添加到你的元组中。 - Corey D
1
为了改进这个,你可以使用operator.isNumberType来确定一个元素是否是数字(请参见我的另一个答案,使用filter而不是列表推导来实现这一点)。 - dalloliogm

20

这应该是Python 2中最高效和最短的代码:

import operator
filter(operator.isNumberType, list_1)

在Python 3中:

import numbers
[x for x in list_1 if isinstance(x, numbers.Number)]

我不使用py3k,但这时只需使用isinstance(x, numbers.Number)而不是operator.isNumberType。 - dalloliogm
好的,我不太了解Python 3k,所以我又改变了示例。 - dalloliogm

3
list_2 = [i for i in list_1 if isinstance(i, (int, float))]

2
所有提出的解决方案仅适用于列表中的数字已经被转换为适当的类型(intfloat)。
我发现自己有一个来自sqlite3fetchall函数的列表。 那里的所有元素都被格式化为str,即使其中一些元素实际上是整数。
cur.execute('SELECT column1 FROM table1 WHERE column2 = ?', (some_condition, ))
list_of_tuples = cur.fetchall()

问题中的等价物将类似于以下内容:

list_1 = [ 'asdada', '1', '123131', 'blaa adaraerada', '0', '34', 'stackoverflow is awesome' ]

针对这种情况,为了获取仅包含整数的列表,我找到了以下替代方法:

list_of_numbers = []
for tup in list_of_tuples:
    try:
        list_of_numbers.append(int(tup[0]))
    except ValueError:
        pass

list_of_numbers 将仅包含初始列表中的所有整数。


1
我认为最简单的方法是:
[s for s in myList if s.isdigit()]

希望这能有所帮助!

0
filter(lambda n: isinstance(n, int), [1,2,"three"])

为了测试各种类型: filter(lambda n: isinstance(n, int) or isinstance(n, float), list_of_values) - Jeff Ober
我指的是数字总体而不仅仅是整数。 - dassouki

0
list_2 = [i for i in list_1 if isinstance(i, (int, float))]

3
isinstance 只接受 2 个参数。 - SilentGhost
可能的意思是:list_2 = [i for i in list_1 if isinstance(i, (int, float))] - hughdbrown

-1
>>> [ i for i in list_1 if not str(i).replace(" ","").isalpha() ]
[1, 123131.13099999999, 9.9999999999999995e-07, 34.124512352650001]

-1

简称为SilentGhost方式

list_2 = [i for i in list_1 if isinstance(i, (int, float))] 

list_2 = [i for i in list_1 if not isinstance(i, str)]

-1
list_1 = [ 'asdada', 1, 123131.131, 'blaa adaraerada', 0.000001, 34.12451235265, 'stackoverflow is awesome' ]

第一个例子:

list_2 = [x for x in list_1 if type(x) == int or type(x) == float ]
print(list_2)

第二个例子:

list_2 = [x for x in list_1 if isinstance(x, (int, float)) ]
print(list_2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接