Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> itertools.takewhile(), Как оставить iterable рабочим? 
:(
    Опции темы
setq
Дата 18.5.2006, 13:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Функция takewhile из модуля itertools отбирает несколько первых элементов "последовательности", которые удовлетворяют заданному условию. Но она также "выкидывает" элемент, который не подошёл по условию. Вот, ломаю голову над тем как это обойти и оставлять этот элемент.

Пример:
Код

>>> import itertools
>>> a = range(10)
>>> a = iter(a)
>>> b = itertools.takewhile(lambda x: x<5, a)
>>> print list(b)
[0, 1, 2, 3, 4]
>>> print list(a)  # смотрите: нет 5!
[6, 7, 8, 9]
 
  Вверх
slav0nic
Дата 18.5.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: 4
Всего: 5



хм, странно, эта ф-ция аналогична
Код

def takewhile(predicate, iterable):
         for x in iterable:
             if predicate(x):
                 yield x
             else:
                 break

если сделать
Код

b = takewhile(lambda x: x<5, a)
print  list(b),list(a)
print  list(b),list(a)

результат:
[0, 1, 2, 3, 4] [6, 7, 8, 9]
[] []
если заменить a=xrange(10)
[0, 1, 2, 3, 4] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
видать проблема в итераторах (редко их юзаю=) )
нихрена не понимаю блин)


  

Это сообщение отредактировал(а) slav0nic - 18.5.2006, 16:51
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
slav0nic
Дата 19.5.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: 4
Всего: 5



по идее в генераторе до break срабатывает итератор, после только после чего вроисходит break и 5 просто теряется) 

Код

>>> a = iter(range(10))
>>> len(a)
10
>>> for x in a:
...     if x<5:
...             print list(a),x

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

а если потом брык, то 0 потерялся бы
вроде всё так

 

Это сообщение отредактировал(а) slav0nic - 19.5.2006, 14:48
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
setq
Дата 19.5.2006, 17:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Чего? Ладно smile спасибо. Есть идея переписать takewhile() с глобальной переменной, куда сохранялся бы потерянный элемент, но она по-моему фиговая - эта идея. Ещё есть идея написать свой класс Итератор с методом takewhile(), но это не дзен. По-моему. Вот. 
  Вверх
slav0nic
Дата 19.5.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: 4
Всего: 5



есть идея не юзать итераторы;) а написать по простому
Код

a = xrange(10)
b = filter(lambda x: x<5, a)
a = filter(lambda x:x>=5, a)

самое тупое) 
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
setq
Дата 19.5.2006, 18:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











С радостью бы. Но мои "итераторы" по 20 миллионов длиной. Их за раз в память не поднять. 
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.