2017-09-28 2 views
0

Ich habe eine verschachtelte Wörterbuch:Sortieren verschachtelte defaultdict

nestedDict = defaultdict(lambda:defaultdict(list)) 

es Werte der Form hat:

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

zB:

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

Ich möchte es sortieren, auf der Grundlage von DocId in aufsteigender Reihenfolge als

Für Beispiel:

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

Ich versuche dies:

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

Ich weiß, das ist falsch, aber ich weiß nicht, wie es richtig zu machen. Ich bin neu bei python.Sorry für das Stellen dieser grundlegenden Frage.

Antwort

1

EDIT: Wir bauen das Wörterbuch um ein geordnetes inneres Diktat um.

Gegeben

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) 

-Code

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

Einzelheiten

Der Code für die OrderedDict s ortes das innere Wörterbuch durch einen Schlüssel. Hinweis: Diese Tasten sind numerische Zeichenketten und werden somit sortiert mit dem float() builtin: Beispiel:

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

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

Das verbleibende Wörterbuch Verständnis neu erstellt das Wörterbuch um diese sortiert dicts. Wenn Sie die äußere defaultdict Typ erhalten wollen, wieder aufzubauen entsprechend:

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 
+0

.Es in absteigender Reihenfolge ist die Sortierung? –

+0

@MuhammadRaghib, es war nicht klar in Ihrer Frage, ob Sie Ihre Schlüssel so sortieren wollten, als wären sie ganze Zahlen oder Strings. 'int ('10 ')> int (' 3 ')', aber '' 10 '<' 3''. Entfernen Sie diesen Aufruf auf "int", wenn Sie Letzteres bevorzugen. – ymbirtt

+0

@ymbirt Dieser Code sortiert nach den Schlüsseln (äußeres Wörterbuch). Ich möchte ihn nach den Schlüsseln des inneren Wörterbuchs sortieren: 309667110602326329470352776628338681619 defaultdict (, {'193083866963132215734985636049608586841': [1895], '39188502589169058624219974133946618900': [1895], '311107235584665083555814081636686808932': [197]}) Es sollte den seine form309767110602326329470352776628338681619 defaultdict (, { '193083866963132215734985636049608586841'.: [1895], '311107235584665083555814081636686808932': [197] ‚39188502589169058624219974133946618900 ': [1895]) –