我有以下输入:
669 866 147
15 881 210
662 15 70
在其上使用.split('\n')
,我可以获得3个字符串的列表。然后我想将每个字符串分解为一个字符串列表,然后将它们转换为int。
我到目前为止尝试使用的代码是
for tr in numbers:
tr = tr.split()
tr = list(map(int, tr))
然而,在for循环关闭之后,原始列表没有发生任何事情,所以如果我运行此命令print(type(numbers[0]))
,它将返回<class 'str'>
。
我猜这是由于循环内部发生的操作所以外面没有任何改变,所以我怎样才能让原来的列表更新呢?
答案 0 :(得分:2)
您必须将列表显式设置回数字列表,此时,您只需要通过重新分配来操作变量tr,因此原始列表不会受到影响。试试这个
>>> numbers = ["669 866 147", " 15 881 210", "662 15 70"]
>>> for idx, tr in enumerate(numbers):
... tr = tr.split()
... numbers[idx] = list(map(int, tr))
...
>>> numbers
[[669, 866, 147], [15, 881, 210], [662, 15, 70]]
答案 1 :(得分:2)
这样的单行可能是这样的:
In [6]: numbers = "669 866 147\n15 881 210\n662 15 70"
In [7]: [[int(y) for y in x.split()] for x in numbers.split('\n')]
Out[7]: [[669, 866, 147], [15, 881, 210], [662, 15, 70]]
您可以将In [7]直接分配给数字,或分配到单独的新变量中。
答案 2 :(得分:0)
import re
numbers = ["669 866 ASSASSA 147", " 15 881 210", "662 15 70"]
numbers = [[int(_str) for _str in re.findall(r"\d+", o)] for o in numbers]
print numbers
# [[669, 866, 147], [15, 881, 210], [662, 15, 70]]
答案 3 :(得分:0)
Pythonic的方法是使用列表理解 - 避免枚举/索引,变异和范围内的新变量:
>>> numbers = ["669 866 147", " 15 881 210", "662 15 70"]
>>> numbers = [map(int, tr.split()) for tr in numbers]
>>> numbers
[[669, 866, 147], [15, 881, 210], [662, 15, 70]]
有些人避免使用内置map
,在这种情况下,你可以用第二行代替:
numbers = [[int(n) for n in tr.split()] for tr in numbers]