例如:
l = [('a',1),('b',2),('a',2)]
collapsed_l = dict(a=[1,2],b=[2])
如何最好地从 l
转换为 collapsed_l
?
从某种意义上讲,我希望能够推广我正在折叠的“字段”,以及通过哪个字段进行折叠。我认为这类似于数据库和电子表格中数据透视表的功能,但我可能有所不同。
例如:
l = [('a',1),('b',2),('a',2)]
collapsed_l = dict(a=[1,2],b=[2])
如何最好地从 l
转换为 collapsed_l
?
从某种意义上讲,我希望能够推广我正在折叠的“字段”,以及通过哪个字段进行折叠。我认为这类似于数据库和电子表格中数据透视表的功能,但我可能有所不同。
>>> 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]})
>>> 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))
>>> d=dict()
>>> for k,e in l:
d.setdefault(k,[]).append(e)
>>> d
{'a': [1, 2], 'b': [2]}
您还可以使用collections.defaultdict
来实现此目的,在这种情况下,您不需要使用setdefault
方法。
collapsed_1 = dict(collapsed_1)
。否则以后可能会出现奇怪的副作用。 - Jeff Tratner