2011-01-17 2 views
0

У меня есть огромный словарь дд {}, где у меня есть люди и наборы фруктов они предпочитают:Накопительный подсчет уникальных значений в словаре

A set(['Apple', 'Orange', 'Strawberries']) 
B set(['Banana', 'Strawberries', 'Orange', 'Kiwi', 'Dates']) 
C set(['Apple', 'Kiwi', 'Grapes']) 
A set(['Banana', 'Orange', 'Apple', 'Lemon']) 

Я хочу кумулятивный счетчик для плодов, то есть для 1-го человек, количество его предпочтительных плодов, для 2-го лица, количество фруктов, принадлежащих предыдущему человеку, плюс число его собственных предпочтительных плодов, которых не было в наборе предыдущего человека и так далее. Я хочу, чтобы иметь результат, как эти:

1 3 
2 6 
3 7 
4 8 

В увеличивающемся значении в первом столбце является лицом, и вторым столбцом кумулятивного количества плодов. Как реализовать это в Python? Спасибо, Адия.

+1

Ваш вывод не соответствует определению проблемы: для лица C ' 'Apple'' Безразлично не существует в наборе предыдущего человека (B). – SilentGhost

+0

Вы уверены, что четвертый человек - 'A'? Как сохранить это в словаре? – eumiro

ответ

3

Что-то вроде этого?

allFruits = set() 
for i,(k,v) in enumerate(sorted(dd.iteritems()), 1): 
    allFruits.update(v) 
    print i, len(allFruits) 

Это работает для Python 2.6 и новее. Для более старых версий, попробуйте следующее:

allFruits = set() 
for i,(k,v) in enumerate(sorted(dd.iteritems())): 
    allFruits.update(v) 
    print i+1, len(allFruits) 

Вход:

dd = {'A': set(['Apple', 'Orange', 'Strawberries']), 
     'B': set(['Banana', 'Dates', 'Kiwi', 'Orange', 'Strawberries']), 
     'C': set(['Apple', 'Grapes', 'Kiwi']), 
     'D': set(['Apple', 'Banana', 'Lemon', 'Orange'])} 

Выход:

1 3 
2 6 
3 7 
4 8 
+0

Да. Не забудьте отсортировать ключи. – ulidtko

+0

Кроме того, вывод ключей вместо индексов в первом столбце, код может быть сделан намного красивее. – ulidtko

+1

'enumerate' имеет начальный параметр. – SilentGhost

Смежные вопросы