2014-02-10 2 views
1

Я борюсь с разделительными линиями в файле данных. Вот несколько строк выборки:Сплит-строка в файле данных

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 

Я хочу, чтобы разбить его, чтобы выйти каждое значение ... может быть в виде массива:

((1, 2) , (0, 120)) 
((1, 2) , (1, 131)) 
... 
((1, 2, 3, 4, 5) , (7, 6, 217, 401, 636)) 

означает, что для каждой строки массива могут иметь разные размеры. Я пытался разбить его в два шага, но он не работает.

inf = open("datafile.txt", 'r') 

for line in inf: 
line.split() 
for x in line.split(): 
    x.split(':',1) 

ответ

3

Вы можете сгруппировать элементы из двух списков, используя функцию 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 подберет все первые элементы и поместить их в списке , а затем он будет выбирать все остальные элементы и помещать их в список и так далее.

Так мы получаем ответ, который вы ожидали.

+0

Большое спасибо, сейчас работает правильно. Я только начинающий в python. Не могли бы вы дать мне быстрый комментарий по zip, * карте и лямбда? – user3041107

+0

@ user3041107 Пожалуйста, проверьте обновленный ответ. Я добавил небольшое объяснение. – thefourtheye

+0

@ user3041107 Также, пожалуйста, рассмотрите [принятие этого ответа] (http://meta.stackexchange.com/a/5235/235416), если это поможет вам – thefourtheye

Смежные вопросы