Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 20, 2010 05:44:49

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

Сделайте мне красиво

Предложу задачку, есть вот такая функция:

def groups(stream, is_group):
group, items = None, []
for item in stream:
if is_group(item):
if group:
yield group, items
group, items = item, []
else:
items.append(item)
if group:
yield group, items

test_data = ('A', 1, 2, 3, 'B', 4, 5, 'C', 7)

for name, items in groups(test_data, lambda x: isinstance(x, str)):
print name, items
==============
A [1, 2, 3]
B [4, 5]
C [7]
Функция работает, но как фальшивые елочные игрушки - не радует. Особенно проверка на group != None два раза. Эстеты, помогите!



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

Офлайн

#2 Апрель 20, 2010 10:59:14

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сделайте мне красиво

так лучше?:

def groupper(d, x):
if isinstance(x, str):
d.append((x, []))
else:
d[-1][1].append(x)
return d

reduce(groupper, test_data, [])



Офлайн

#3 Апрель 20, 2010 11:48:17

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сделайте мне красиво

Вот ленивый вариант:

from itertools import groupby
it = groupby(test_data, lambda x: isinstance(x, str))
for item in it:
print item[1].next(), list(it.next()[1])



Офлайн

#4 Апрель 20, 2010 12:16:24

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

Сделайте мне красиво

Ed
Вот ленивый вариант:
from itertools import groupby
it = groupby(test_data, lambda x: isinstance(x, str))
for item in it:
print item[1].next(), list(it.next()[1])
Это отлично! Постоянно забываю про содержимое itertools



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

Офлайн

#5 Апрель 20, 2010 12:30:35

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сделайте мне красиво

там еще можно вместо лямбды поюзать functools.partial, кстати.



Офлайн

#6 Апрель 20, 2010 12:42:57

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Сделайте мне красиво

я как всегда увлекся и решил не ту задачу :D

test_data = ('A', 1, 2, 3, 'B', 4, 5, 'C', 7, '#')
letters = [i for i in test_data if isinstance(i, str)]
print dict(zip(letters,
[test_data[test_data.index(letters[i]) + 1 : test_data.index(letters[i + 1])] for i in xrange(len(letters) - 1)]))
---------------------
{'A': (1, 2, 3), 'C': (7,), 'B': (4, 5)}
без словаря соответственно



Отредактировано (Апрель 20, 2010 12:46:33)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version