Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 12, 2014 14:57:36

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

Есть ли в генераторах возможность сохранять некоторое промежуточное значение? (для 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 как в данном примере.

Офлайн

#2 Авг. 12, 2014 15:49:06

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

Записать по кускам? Заодно и более читаемо

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']



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

Офлайн

#3 Авг. 12, 2014 19:46:23

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

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:])



Отредактировано Budulianin (Авг. 12, 2014 19:49:29)

Офлайн

#4 Авг. 13, 2014 04:49:26

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

PooH
Записать по кускам? Заодно и более читаемо
Согласен с Вами, только я бы так написал:
lines = map(str.split, open("/some/file"))
data = [x[2:] for x in lines if x[2:4] == ('var1', 'var2')]



Офлайн

#5 Авг. 13, 2014 05:07:11

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

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



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

Отредактировано PooH (Авг. 13, 2014 05:15:23)

Офлайн

#6 Авг. 13, 2014 05:32:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

PooH
У вас уже в первой строке создается список
В третьем вроде же нет?



Офлайн

#7 Авг. 13, 2014 05:51:00

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

FishHook
В третьем вроде же нет?
Странное замечание, если учесть, что у pyuser всего две строчки :)

А вообще, напомню, что в python 2.5-2.7 - map возвращает список



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

Офлайн

#8 Авг. 13, 2014 10:33:42

scopichol
Зарегистрирован: 2014-08-04
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

Записать по кускам? Заодно и более читаемо
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, созданы не для таких извращений.
Пишите код для людей.
Полностью согласен.

Необязательно всегда пользоваться одной конструкцией. Как бы она нибыла привлекательной

Офлайн

#9 Авг. 13, 2014 10:52:36

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

FishHook
В третьем вроде же нет?
PooH
FishHook
В третьем вроде же нет?
Странное замечание, если учесть, что у pyuser всего две строчки :)
Блин, только дошло - речь про третий питон :) ага, в третьем итератор, но ТС про вторую ветку спрашивает



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

Офлайн

#10 Авг. 13, 2014 10:53:56

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Использования промежуточных значений в генераторах

scopichol
Никуда не годится.
Это ж работа с файлом. Какие списки.
Что не годится? Разуйте глаза, там нет списков, там генераторы, список появляется в последний момент из уже отфильтрованных данных.



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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version