Вы можете сгруппировать элементы из двух списков, используя функцию zip
.
with open("Input.txt") as inf:
for line in inf:
print zip(*map(lambda x: map(int, x.split(":")), line.split()))
Выход
[(1, 2), (0, 120)]
[(1, 2), (1, 131)]
[(1, 2), (2, 26)]
[(1, 2), (3, 568)]
[(1, 2), (4, 176)]
[(1, 2, 3), (5, 28, 549)]
[(1, 2), (6, 17)]
[(1, 2, 3, 4, 5), (7, 6, 217, 401, 636)]
[(1, 2), (8, 139)]
Предложение: Это всегда хорошо, чтобы открыть файлы с with
ключевым словом, как я показал в коде выше. Потому что он позаботится о том, чтобы закрыть/освободить ресурсы, даже если программа завершилась с ошибкой.
Пояснение:
Поскольку zip
является вызовом функции, параметры вычисляются в первую очередь. Перейдем к *
. map(lambda x: map(int, x.split(":")), line.split())
, мы применяем лямбда-функцию lambda x: map(int, x.split(":"))
к каждому элементу списка строк, возвращаемому line.split()
(который разбивает предложения на пробельные символы и возвращает список).
Каждое разделенное слово будет передаваться как параметр функции лямбда по одному. Если мы возьмем первый случай, сначала "1:0"
будет отправлен на лямбда-функцию как x
, где мы разделим на основе :
, который даст список ["1", "0"]
, а затем применим функцию int
, которая даст [1, 0]
. Таким образом, после того, как все линии расщепляются и лямбда применяются, то результат будет выглядеть следующим образом
[[1, 0], [2, 120]]
[[1, 1], [2, 131]]
[[1, 2], [2, 26]]
[[1, 3], [2, 568]]
[[1, 4], [2, 176]]
[[1, 5], [2, 28], [3, 549]]
[[1, 6], [2, 17]]
[[1, 7], [2, 6], [3, 217], [4, 401], [5, 636]]
[[1, 8], [2, 139]]
Теперь у нас есть два элемента в каждом списке. Помните *
, которую мы решили обсудить позже, он будет распаковать список и передать все элементы в качестве параметров функции zip
, как этого
zip([1, 0], [2, 120])
Теперь zip
подберет все первые элементы и поместить их в списке , а затем он будет выбирать все остальные элементы и помещать их в список и так далее.
Так мы получаем ответ, который вы ожидали.
Большое спасибо, сейчас работает правильно. Я только начинающий в python. Не могли бы вы дать мне быстрый комментарий по zip, * карте и лямбда? – user3041107
@ user3041107 Пожалуйста, проверьте обновленный ответ. Я добавил небольшое объяснение. – thefourtheye
@ user3041107 Также, пожалуйста, рассмотрите [принятие этого ответа] (http://meta.stackexchange.com/a/5235/235416), если это поможет вам – thefourtheye