У меня есть следующий вход:

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'>.

Я предполагаю, что это происходит из-за операции, происходящей внутри цикла, поэтому вне ее ничего не изменилось, так как бы мне сделать так, чтобы оригинальный список тоже обновлялся?

1
rain-m 8 Дек 2016 в 16:10

4 ответа

Лучший ответ

Вам придется явно установить списки обратно в список номеров, прямо сейчас, вы только манипулируете переменной 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]]
2
mu 無 8 Дек 2016 в 13:15

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]
0
Tyson 8 Дек 2016 в 14:27

Однострочник для этого может быть таким:

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
Leo 8 Дек 2016 в 13:27
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]]
0
Ari Gold 8 Дек 2016 в 13:25