2012-04-30 2 views
3

Например:Как свернуть элементы в Python?

l = [('a',1),('b',2),('a',2)] 

collapsed_l = dict(a=[1,2],b=[2]) 

Как лучше всего получить от l до collapsed_l?

В некотором смысле, я хочу каким-то образом обобщить, какое «поле» я рушаюсь, и в каком поле. Я думаю, что это похоже на то, что сводные таблицы делают в базах данных и таблицах, но я могу ошибаться.

ответ

5
>>> from collections import defaultdict 
>>> l = [('a',1),('b',2),('a',2)] 
>>> collapsed_l = defaultdict(list)  
>>> for letter,num in l: 
     collapsed_l[letter].append(num) 


>>> collapsed_l 
defaultdict(<type 'list'>, {'a': [1, 2], 'b': [2]}) 
+0

Ницца, простой ответ. Но вы можете преобразовать его обратно в dict в конце: 'collapsed_1 = dict (collapsed_1)'. В противном случае позже могут появиться странные побочные эффекты. –

2

Самый чистый из всех будет состоять в том, чтобы перебирать список кортежей и добавлять элементы в словарь. Setdefault гарантирует, что если ключ отсутствует, будет добавлен пустой список. Если ключ присутствует, элемент будет добавлен в список.

>>> d=dict() 
>>> for k,e in l: 
    d.setdefault(k,[]).append(e)   
>>> d 
{'a': [1, 2], 'b': [2]} 

Вы также можете использовать collections.defaultdict для этой цели, в этом случае вам не нужно метод setdefault.

5
>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> l = [('a',1),('b',2),('a',2)] 
>>> dict((k,[n for l,n in v]) for k,v in groupby(sorted(l),itemgetter(0))) 
{'a': [1, 2], 'b': [2]} 

Не уверен, что если порядок свернутых вопросов ценностей, если так что вы можете редактировать sorted(l) к sorted(l,key=itemgetter(0))

+0

+1 Это очень хороший способ сделать это. –