Найти - Пользователи
Полная версия: Сделайте мне красиво
Начало » Python для новичков » Сделайте мне красиво
1
PooH
Предложу задачку, есть вот такая функция:
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 два раза. Эстеты, помогите!
Ed
так лучше?:
def groupper(d, x):
if isinstance(x, str):
d.append((x, []))
else:
d[-1][1].append(x)
return d

reduce(groupper, test_data, [])
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])
PooH
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
Ed
там еще можно вместо лямбды поюзать functools.partial, кстати.
Zubchick
я как всегда увлекся и решил не ту задачу :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)}
без словаря соответственно
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