Найти - Пользователи
Полная версия: Использования промежуточных значений в генераторах
Начало » Python для экспертов » Использования промежуточных значений в генераторах
1 2 3
agryn
Есть ли в генераторах возможность сохранять некоторое промежуточное значение? (для python 2.5-2.7)
Например для оптимизации такого генератора:
data = [line.split()[2:] for line in open('/some/file') if line.split()[2] == 'var1' and line.split()[3] == 'var2']
Чтобы сделать один раз split для строки а не 3 как в данном примере.
PooH
Записать по кускам? Заодно и более читаемо
lines = (line for line in open('/some/file'))
splited_lines = (line.split() for line in lines)
data = [x[2:] for x in splited_lines if x[2] == 'var1' and x[3] == 'var2']
Budulianin
agryn
Есть ли в генераторах возможность сохранять некоторое промежуточное значение?
Нет. Нужно понимать, что list comprehensions, созданы не для таких извращений.
Пишите код для людей.

data = []
for line in open('/some/file’):
    line_sp = line.split()
    if line_sp[2] == 'var1' and line_sp[3] == var2:
        data.append(line_sp[2:])
pyuser
PooH
Записать по кускам? Заодно и более читаемо
Согласен с Вами, только я бы так написал:
lines = map(str.split, open("/some/file"))
data = [x[2:] for x in lines if x[2:4] == ('var1', 'var2')]
PooH
pyuser
Согласен с Вами, только я бы так написал:
lines = map(str.split, open("/some/file"))
data = [x[2:] for x in lines if x[2:4] == ('var1', 'var2')]
У вас уже в первой строке создается список, в моем варианте везде генераторы, список создается только в конце. Теперь представим что в файле 10050 строк и их них десяток нужных, как у нас потрблением памяти?

ЗЫ: Сейчас опечатался интересно: потеребление памяти :)
ЗЫ2: У вас еще и условие ошибчно:
>>> [0, 1] == (0,1)
2: False
FishHook
PooH
У вас уже в первой строке создается список
В третьем вроде же нет?
PooH
FishHook
В третьем вроде же нет?
Странное замечание, если учесть, что у pyuser всего две строчки :)

А вообще, напомню, что в python 2.5-2.7 - map возвращает список
scopichol
Записать по кускам? Заодно и более читаемо
lines = (line for line in open('/some/file'))
splited_lines = (line.split() for line in lines)
data = [x for x in splited_lines if x == ‘var1’ and x == ‘var2’]
Никуда не годится.
Это ж работа с файлом. Какие списки.

Нет. Нужно понимать, что list comprehensions, созданы не для таких извращений.
Пишите код для людей.
Полностью согласен.

Необязательно всегда пользоваться одной конструкцией. Как бы она нибыла привлекательной
PooH
FishHook
В третьем вроде же нет?
PooH
FishHook
В третьем вроде же нет?
Странное замечание, если учесть, что у pyuser всего две строчки :)
Блин, только дошло - речь про третий питон :) ага, в третьем итератор, но ТС про вторую ветку спрашивает
PooH
scopichol
Никуда не годится.
Это ж работа с файлом. Какие списки.
Что не годится? Разуйте глаза, там нет списков, там генераторы, список появляется в последний момент из уже отфильтрованных данных.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB