Есть ли краткий способ переписать следующий фрагмент кода в виде списка?
nsms = []
for line in lines:
fields = line.split(';')
if len(fields) > 4 and fields[4] == 'NSM':
nsms += [fields]
Проблема заключается в полях временных переменных. Без него механизм понимания должен вызывать разбиение (до) трех раз на строку:
nsms = [line.split(';')
for line in lines
if len(line.split(';')) > 4 and line.split(';')[4] == 'NSM']
Меня беспокоит не неэффективность избыточных вызовов, а их влияние на выразительность кода и повышенный риск опечатки.
Я подумал, что, возможно, может помочь:
# My failed attempt
nsms = [fields
for line in lines
with fields = line.split(';')
if len(fields) > 4 and fields[4] == 'NSM']
(Мне показалось весьма удивительным, что это не удалось из-за ошибки отступа. Другие мои попытки привели к синтаксической ошибке, указывающей на .)
Насколько я могу судить, цикл for — единственный способ ввести локальное временное значение в понимание списка, поэтому возможным хаком было бы «перебирать» список из одного элемента следующим образом:
nsms = [fields
for line in lines
for fields in [line.split(';')]
if len(fields) > 4 and fields[4] == 'NSM']
Это работает, но есть ли способ сделать это, не маскируя временное значение под переменную индукции цикла?
В приведенных выше примерах строки — это список строк из текстового файла, который содержит значения, разделенные точкой с запятой. В частности, из копии UnicodeData.txt:
with open('UnicodeData.txt', 'r') as source:
lines = source.readlines()
Подробнее здесь: https://stackoverflow.com/questions/787 ... prehension