вложенные понимания списка Python для построения списка списков

Я - Python newb и испытываю затруднения groking вложенные понимания списка. Я пытаюсь написать некоторый код, чтобы читать в файле и создать список для каждого символа для каждой строки.

таким образом, если файл содержит

xxxcd
cdcdjkhjasld
asdasdxasda

Получающийся список был бы:

[
['x', 'x', 'x', 'c', 'd']
['c', 'd', 'c', 'd', 'j', 'k', 'h', 'j'', 'l', 'd']
[', 'd'', 'd', 'x'', 'd']
]

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

data = []
f = open(file,'r')
for line in f:
    line = line.strip().upper()
    list = []
    for c in line:
        list.append(c)
    data.append(list)
5
задан shsteimer 30 December 2009 в 20:00
поделиться

7 ответов

Это должно помочь (вам, вероятно, придется поиграть с ним, чтобы удалить новые строки или отформатировать его так, как вы хотите, но основная идея должна сработать):

f = open(r"temp.txt")
[[c for c in line] for line in f]
19
ответ дан 18 December 2019 в 06:11
поделиться

В вашем случае вы можете использовать конструктор list для работы с внутренним контуром и для работы с внешним контуром использовать понимание списка. Что-то вроде:

f = open(file)
data = [list(line.strip().upper()) for line in f]

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

Понимание списка функционально эквивалентно:

data = []
for line in f:
    data.append(list(line.strip().upper()))
3
ответ дан 18 December 2019 в 06:11
поделиться
data = [list(line.strip().upper()) for line in open(file,'r')]
1
ответ дан 18 December 2019 в 06:11
поделиться

Единственное действительно существенное различие между строками и списками символов заключается в том, что строки незыблемы. Вы можете повторять итерации и нарезать строки так же, как и списки. И гораздо удобнее работать со строками как со строками, так как они поддерживают методы строк, а списки - нет.

Так что для большинства приложений я бы не стал беспокоиться о преобразовании элементов в данных в список; я бы просто сделал:

data = [line.strip() for line in open(filename, 'r')]

Когда мне нужно было работать со строками в данных как с мутируемыми списками, я бы использовал список , чтобы преобразовать их, и присоединил , чтобы вернуть их обратно, д. g.:

data[2] = ''.join(sorted(list(data[2])))

Конечно, если все, что вы собираетесь сделать с этими строками, это изменить их, то давайте, храните их как списки.

.
1
ответ дан 18 December 2019 в 06:11
поделиться

Вот один уровень понимания списка.

data = []
f = open(file,'r')

for line in f:
    data.append([ch for ch in line.strip().upper()])

Но мы можем сделать все это за один раз:

f = open(file, 'rt')
data = [list(line.strip().upper()) for line in f]

Это использование list() для преобразования строки в список односимвольных строк. Мы также можем использовать вложенные понимания списков, и поместить open() в строку:

data = [[ch for ch in line.strip().upper()] for line in open(file, 'rt')]

На данный момент, однако, я думаю, что понимания списков отвлекают от легкой читабельности происходящего.

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

Также, как сказал Крис Лутц в комментарии, в данном случае нет причин явно разделять каждую строку на списки символов; вы всегда можете относиться к строке как к списку, и вы можете использовать строковые методы со строкой, но вы не можете использовать строковые методы со списком. (Ну, вы можете использовать ''.join() для обратного соединения списка со строкой, но почему бы просто не оставить его как строку?)

.
2
ответ дан 18 December 2019 в 06:11
поделиться

Сначала вы можете совместить часть line.strip().upper() с внешним for-loop, как это:

for line in [l.strip().upper() for l in f]:
    # do stuff

Затем вы можете сделать итерацию по символам в понимании списка, но это не будет короче или яснее. Самый аккуратный способ сделать то, что вы там делаете, это:

list(someString)

Таким образом вы могли бы сделать:

data = [list(l.strip().upper()) for l in f]

Я не знаю, так ли хорошо это говорит о ваших намерениях. Обработка ошибок также является проблемой, целое выражение умрет, если возникнет проблема на пути.


Если вам не нужно хранить весь файл и все строки в памяти, вы можете сделать из него выражение генератора. Это очень полезно при обработке огромных файлов, и вам нужно обрабатывать только часть файла за раз. Вместо этого в выражениях генератора используются круглые скобки, например:

data = (list(l.strip().upper()) for l in f)

data станет генератором, который будет выполнять выражение для каждой строки в файле, но только в том случае, если вы выполните по ней итерацию; сравните это с пониманием списка, которое создаст огромный список в памяти. Обратите внимание, что data - это не список, а генератор, и скорее родство с итератором на C++ или IEnumerator на C#.

Генератор может быть легко подан в список: list(someGenerator) Это несколько противоречит цели, но иногда является необходимостью.

.
0
ответ дан 18 December 2019 в 06:11
поделиться
>>> f = file('teste.txt')
>>> print map(lambda x: [c for c in x][:-1], f)
[['x', 'x', 'x', 'c', 'd'], ['c', 'd', 'c', 'd', 'j', 'k', 'h', 'j', 'a', 's', 'l', 'd'], ['a', 's', 'd', 'a', 's', 'd', 'x', 'a', 's', 'd']]
0
ответ дан 18 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: