我应该如何在Python中折叠元素?

时间:2012-04-30 15:49:20

标签: python python-2.7

例如:

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

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

如何最好地从l转到collapsed_l

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

3 个答案:

答案 0 :(得分: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]})

答案 1 :(得分: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))

答案 2 :(得分:2)

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

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

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