如何将一个由空格和逗号分隔的数字字符串转换为整数列表

51
我有一串数字,像这样:
example_string = '0, 0, 0, 11, 0, 0, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 11'

我想把它转换成一个列表:
example_list = [0, 0, 0, 11, 0, 0, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 11]

我尝试了这段代码:
example_list = []
for x in example_string:
    example_list.append(int(x))

显然这个方法不起作用,因为字符串中包含空格和逗号。即使我去掉了它们,数字的每个位数也会被转换,导致结果如[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 9, 0, 9, 0, 0, 0, 0, 0, 0, 1, 1]
我该如何得到期望的结果?
参见:如何将以空格分隔的数字字符串拆分为整数?。这个问题增加了一个小的额外考虑:由于int可以接受前导和尾随的空白字符,所以有理由仅在,上进行拆分,而不是,
解决这个问题的明显方法是一系列简单任务的常见组合:
- 如何将字符串拆分为单词列表? - 如何将字符串解析为浮点数或整数? - 如何在列表、字典等中收集重复计算的结果(或对每个元素进行修改后创建列表的副本)? 然而,根据具体要求,可以用其他方式解决。对于某些情况,仅使用分割步骤可能已经足够了。还有其他方法,在这里的一些答案中提供了不同于原生Python列表的输出方式 - 例如,使用标准库的array.array或NumPy数组。
另外,这个问题也可以看作是如何从字符串中提取数字的特殊情况

2
example_string.split(',') - Jochen Ritzel
6个回答

98

按逗号分隔,然后将其映射为整数:

map(int, example_string.split(','))

或者使用列表推导式:

[int(s) for s in example_string.split(',')]

如果您想要列表结果,后者效果更好,或者您可以将map()调用包装在list()中。

这是可行的,因为int()可以容忍空格:

>>> example_string = '0, 0, 0, 11, 0, 0, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 11'
>>> list(map(int, example_string.split(',')))  # Python 3, in Python 2 the list() call is redundant
[0, 0, 0, 11, 0, 0, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 11]
>>> [int(s) for s in example_string.split(',')]
[0, 0, 0, 11, 0, 0, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 11]

仅以逗号分隔在处理各种不同输入时更加容错;无论值之间使用0、1或10个空格都不会影响结果。


4
对于Python3,您需要将map(int, example_string.split(','))更改为list(map(int, example_string.split(','))) - Tengerye
1
@Tengerye:这取决于你的需求;如果你只需要一个可迭代对象,那么map()对象就可以了。 - Martijn Pieters
谢谢!(直译为“谢谢一百万次!”) - Emjey

14

我猜最不干净的解决方案就是这个:

list(eval('0, 0, 0, 11, 0, 0, 0, 11'))

如果原始数字字符串以“Python格式”存储,则此解决方案实际上将适应存储的任何类型的数据。'0, 0, 0, 11'将映射到int类型,而'0.12, 0.1, 1.2'将映射到float类型,无需明确编码。 - Marcos
3
可能还有更脏的东西,但它已经够脏了,足以让你赢得我的反对票。为什么要发布这样一个可怕的解决方案呢? - Aran-Fey

7
应该可以运行:
example_string = '0, 0, 0, 11, 0, 0, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 11'
example_list = [int(k) for k in example_string.split(',')]

7
number_string = '0, 0, 0, 11, 0, 0, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 11'

number_string = number_string.split(',')

number_string = [int(i) for i in number_string]

1
嘿,Rohit :)。欢迎来到SO。你介意在你的代码中添加一些解释吗?这样下一个来的人就能更好地了解你的答案在做什么了 :). - Patrice

6
您还可以在分割字符串时使用列表推导式
[ int(x) for x in example_string.split(',') ]

2

试试这个:

import re
[int(s) for s in re.split('[\s,]+',example_string)]

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