Форум сайта python.su
Предложу задачку, есть вот такая функция:
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]
Офлайн
так лучше?:
def groupper(d, x):
if isinstance(x, str):
d.append((x, []))
else:
d[-1][1].append(x)
return d
reduce(groupper, test_data, [])
Офлайн
Вот ленивый вариант:
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])
Офлайн
EdЭто отлично! Постоянно забываю про содержимое itertools
Вот ленивый вариант: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])
Офлайн
там еще можно вместо лямбды поюзать functools.partial, кстати.
Офлайн
я как всегда увлекся и решил не ту задачу :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)
Офлайн