Python: понимание списка со списком списков

1

Как написать следующий код в понимании списка?

grid = open('some_file.txt', 'r')
lines = [line.strip('\n') for line in grid]

list_of_lists = []

for line in lines:
    elms = [int(elm) for elm in line.split(' ')]
    list_of_lists.append(elms)

Мой файл выглядит примерно так:

3 8 6 9 4
4 3 0 8 6
2 8 3 6 9
3 7 9 0 3

Который означает, что:

grid = '3 8 6 9 4\n4 3 0 8 6\n2 8 3 6 9\n3 7 9 0 3'
  • 0
    Да, это было то, что я имел в виду. Не то чтобы это было необходимо, но я пытался лучше понять понимание списка. @SpghttCd
Теги:
python-3.x
list-comprehension

4 ответа

1
Лучший ответ

Здесь попробуйте, сначала разделите каждую строку, и вы получите список чисел в виде строки, поэтому функцию map можно использовать, чтобы изменить ее на int:

with open('file.txt', 'r') as f:
    k = [list(map(int,i.split())) for i in f.readlines()]
    print(k)
1

Вам не нужно применять str.strip и str.split отдельно. Вместо этого объедините их в одну операцию. Понимание списка строится путем определения элемента списка, за которым следует итерация по циклу for.

Также обратите внимание, что str.strip без аргумента будет иметь дело с \n а также с пробелом. Аналогично, str.split без аргумента будет разделяться пробелом.

from io import StringIO

x = StringIO("""3 8 6 9 4
4 3 0 8 6
2 8 3 6 9
3 7 9 0 3""")

# replace x with open('some_file.txt', 'r')
with x as grid:
    list_of_lists = [[int(elm) for elm in line.strip().split()] for line in grid]

Результат:

print(list_of_lists)

[[3, 8, 6, 9, 4],
 [4, 3, 0, 8, 6],
 [2, 8, 3, 6, 9],
 [3, 7, 9, 0, 3]]

При использовании встроенных модулей, это немного более эффективно для использования map:

list_of_lists = [list(map(int, line.strip().split())) for line in grid]
0

int не заботится о символах новой строки, поэтому вы можете пропустить их удаление.

>>> fake_file = '3 8 6 9 4\n4 3 0 8 6\n2 8 3 6 9\n3 7 9 0 3\n'.splitlines()
>>> [[int(x) for x in line.split()] for line in fake_file]
[[3, 8, 6, 9, 4], [4, 3, 0, 8, 6], [2, 8, 3, 6, 9], [3, 7, 9, 0, 3]]

Обратите внимание: pandas и numpy предлагают функции высокого уровня для чтения в таких данных, например, numpy.loadtxt или pandas.read_csv.

0

Вы можете использовать функцию карты

grid = open('some.txt', 'r')
lines = [line.strip('\n') for line in grid]

list_of_lists = []

f = lambda line: [int(elm) for elm in line.split(' ')]
list_of_lists = map(f, lines)
print(list_of_lists)

Или вы могли бы реализовать его еще короче

f = lambda line: map(int, line.split(' '))
list_of_lists = map(f, lines)
print(list_of_lists)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню