如何在Python中折叠元素?

3

例如:

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

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

如何最好地从 l 转换为 collapsed_l?

从某种意义上讲,我希望能够推广我正在折叠的“字段”,以及通过哪个字段进行折叠。我认为这类似于数据库和电子表格中数据透视表的功能,但我可能有所不同。

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]})

不错,简单明了的答案。但是最后你可能需要将其转换回字典:collapsed_1 = dict(collapsed_1)。否则以后可能会出现奇怪的副作用。 - Jeff Tratner

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))


+1 这是一种非常好的做法。 - Gareth Latty

2
最干净的方式是遍历元组列表,并将元素添加到字典中。 setdefault 会确保如果键不存在,则会添加一个空列表。如果键存在,则该元素将被附加到列表中。
>>> d=dict()
>>> for k,e in l:
    d.setdefault(k,[]).append(e)        
>>> d
{'a': [1, 2], 'b': [2]}

您还可以使用collections.defaultdict来实现此目的,在这种情况下,您不需要使用setdefault方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接