2011-01-03 4 views
1

Допустим, у меня есть файл, как это (вид, что были матрица):список понимания выбранных индексы

abcde 
fghik 
lmnop 

Я хочу, чтобы поместить это в 2d списка, но только с колоннами до индекса 3:

# 0 1 2 3 
[['a','b','c','d'], 
    ['f','g','h','i'], 
    ['l','m','n','o']] 

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

f = open('file.txt') 
lines = f.readlines() 
matrix = [[a for a in b] for b in lines] # this gets all columns, up to 4 

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

ответ

7

Если я правильно понял вопрос, это должно работать (но, возможно, я уже упрощаю). Обратите внимание, что [: 4] во внутреннем понимании:

f = open('file.txt') 
lines = f.readlines() 
matrix = [[a for a in b[:4]] for b in lines] # this gets all columns, up to 4 
+0

Действительно. Забыл о нарезке! – ash

3

Кусочка каждая строка до 3-я колонка: matrix = [[a for a in b][:3] for b in lines]

+0

еще лучше: 'матрица = [Ь [: 3] для Ь в строках]' – albertov

+0

даст вам список строк, хотя, не список списки. – sepp2k

+0

Вы можете просто сделать 'list (b [: 3])' (или хотя бы переместить '[: 3]' внутри listcomp, на 'b', чтобы вы не реплицировали остальную часть' b'). – delnan

2

«но только с колоннами до 3»? Что это значит? Основываясь на вашем примере, вы имеете в виду «только первые четыре столбца»? Если это так, просто:

with f as open('file.txt'): 
    matrix = [list(line[:4]) for line in f] 

Вызов readlines ненужно (хуже, вредно, как он потребляет много памяти для больших файлов), вы можете перебирать строки просто файл.

+0

К сожалению, столбцы были проиндексированы нулями. Спасибо за отзыв на чтениях, я буду помнить об этом (хотя для моей проблемы это не проблема). – ash

+0

@Jasie: Возможно, это не проблема, но вы никогда не знаете, как это может измениться в будущем;) Кроме того, код * короче * и * более читаемый * таким образом - очень редко возникает причина использовать ' readlines' (и даже тогда, 'list (file)' делает то же самое). – delnan

+0

Я вижу. Есть ли разница в эффективности между 'list (file)' и 'readlines()'? – ash

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