对嵌套的defaultdict

时间:2017-09-28 05:50:00

标签: python defaultdict

我有一个嵌套词典:

nestedDict = defaultdict(lambda:defaultdict(list))

它具有以下形式的值:

termId: {
    'docId': [position1, position2, position3, position4],
    'docId': [position1, position2, position3, position4]
}

例如:

95074715468325493716883841120098961347 defaultdict(<class 'list'>, 
{'193083866963132215734985636049608586841': [1922, 1948, 1952, 1954], 
 '39188502589169058624219974133946618900': [1922, 1948, 1952, 1954]}) 

我希望以docId为基础按升序排序

例如:

1: {1:[1,2,3],2:[1,3,4],3:[1,3,4]} //docId should be in ascending order in each row

2: {1:[1,2,3],2:[1,3,4],3:[1,3,4]}

我正在尝试这个:

orderedDict = OrderedDict(sorted(nestedDict.items(), key=lambda t: nestedDict[1][0]))

我知道这是错的,但我不知道如何做对。我是python的新手。请问这个基本问题。

1 个答案:

答案 0 :(得分:1)

编辑:我们围绕有序的内部词典重建词典。

<强>鉴于

import collections as ct


nested_dict = ct.defaultdict(lambda: ct.defaultdict(list))
d = {95074715468325493716883841120098961347:
     {
        "193083866963132215734985636049608586841": [1922, 1948, 1952, 1954], 
        "39188502589169058624219974133946618900": [1921, 1948, 1952, 1954],
        "100" : [1923, 1948, 1952, 1954], 
    }
}
nested_dict.update(d)

<强>代码

>>> {k: ct.OrderedDict(sorted(v.items(), key=lambda x: float(x[0]))) for k, v in nested_dict.items()}
{95074715468325493716883841120098961347: OrderedDict([
    ('100', [1923, 1948, 1952, 1954]),
    ('39188502589169058624219974133946618900', [1921, 1948, 1952, 1954]),
    ('193083866963132215734985636049608586841', [1922, 1948, 1952, 1954])])}

<强>详情

OrderedDict的代码通过键对内部字典进行排序。注意:这些键是数字字符串,因此使用内置float()进行排序:示例:

inner_dict = {
    "200": [], 
    "300": [], 
    "100": [],    
}

ct.OrderedDict(sorted(inner_dict.items(), key=lambda x: float(x[0])))
# OrderedDict([('100', []), ('200', []), ('300', [])])

剩下的字典理解重建围绕这些排序的词典的字典。如果您希望保留外部defaultdict类型,请相应地重建:

rebuilt_dict = ct.defaultdict(list)
for k, v in nested_dict.items():
    rebuilt_dict[k] = ct.OrderedDict(sorted(v.items(), key=lambda x: float(x[0])))

rebuilt_dict