多个列表的字典

时间:2013-04-03 11:54:17

标签: python python-2.7

我有一个这样的清单:

list=[[21768L, u'2'], [1746L, u'2'], [2239L, u'2'],[2239L, u'2'], [1965L, u'2'],[1965L, u'2'], [2425L, u'1'], [2425L, u'1'],[2056L, u'1']]

如何以字典的形式获得上述列表:

d={u'1':[2425L,2],[2056L,1] , u'2': [21768L, 1],[1746L,1],[2239L,2],[1965L,2]}

2 个答案:

答案 0 :(得分:9)

使用defaultdict模块中的Countercollections

from collections import defaultdict, Counter

d = defaultdict(Counter)

for value, key in yourlist:
    d[key].update([value])

这给你略有不同的结构:

defaultdict(<class 'collections.Counter'>, {u'1': Counter({2425L: 2, 2056L: 1}), u'2': Counter({1965L: 2, 2239L: 2, 21768L: 1, 1746L: 1})})

但可以按摩到更接近你想要的东西:

d = {key: value.most_common() for key, value in d.iteritems()}

给出:

{u'1': [(2425L, 2), (2056L, 1)], u'2': [(1965L, 2), (2239L, 2), (21768L, 1), (1746L, 1)]}

答案 1 :(得分:0)

>>> from collections import defaultdict, OrderedDict
>>> L = [[21768L, u'2'], [1746L, u'2'], [2239L, u'2'], [2239L, u'2'], [1965L, u'2'],[1965L, u'2'], [2425L, u'1'], [2425L, u'1'], [2056L, u'1']]
>>> d = defaultdict(OrderedDict)
>>> for value, key in L:
        d[key][value] = d[key].get(value, 0) + 1


>>> d
defaultdict(<class 'collections.OrderedDict'>, 
            {u'1': OrderedDict([(2425L, 2), (2056L, 1)]), 
             u'2': OrderedDict([(21768L, 1), (1746L, 1), (2239L, 2), (1965L, 2)])})