3

例如:

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

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

如何最好地从lcollapsed_l

从某种意义上说,我想要某种方式来概括我正在崩溃的“领域”以及哪个领域。我认为这类似于数据透视表在数据库和电子表格中的作用,但我可能错了。

4

3 回答 3

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]})
于 2012-04-30T15:56:18.183 回答
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))

于 2012-04-30T16:06:40.987 回答
2

最干净的方法是遍历元组列表并将元素添加到字典中。Setdefault 将确保如果密钥不存在,则将添加一个空列表。如果键存在,则元素将被附加到列表中。

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

您也可以将collections.defaultdict其用于此目的,在这种情况下您不需要该setdefault方法。

于 2012-04-30T15:55:19.883 回答