2016-12-04 1 views
1

Ich habe ein Wörterbuch ngram_list bekam wie folgt:Überprüfen Sie, ob der Dict-Schlüssel eine Teilzeichenfolge eines anderen Elements im Wörterbuch in Python ist.

ngram_list = dict_items([ 
    ('back to back breeding', {'wordcount': 4, 'count': 3}), 
    ('back breeding', {'wordcount': 2, 'count': 5}), 
    ('several consecutive heats', {'wordcount': 3, 'count': 2}), 
    ('how often should', {'wordcount': 3, 'count': 2}), 
    ('often when breeding', {'wordcount': 3, 'count': 1}) 
]) 

ich die Liste von der kürzesten zu wordcount der größten und dann Schleife durch das Wörterbuch und wenn der Schlüssel eine Teilirgendeines anderen sortieren wollen, ist Artikel, löschen

Erwartete Ausgabe (die Teil Artikel.):

ngram_list = dict_items([ 
    ('several consecutive heats', {'wordcount': 3, 'count': 2}), 
    ('how often should', {'wordcount': 3, 'count': 2}), 
    ('often when breeding', {'wordcount': 3, 'count': 1}), 
    ('back to back breeding', {'wordcount': 4, 'count': 3}) 
]) 
+0

was ist Ihr letzter erwarteter Ausgabe-Wörterbuch ausgestattet werden? – Skycc

+0

@Skycc aktualisiert Entschuldigung – Lazhar

+0

so wollen Sie Ihre Ausgabe als Wörterbuch oder Liste von Tupeln wie dict.items() zurückgeben? Für die in der Reihenfolge – Skycc

Antwort

1

erste Filter das Eingangs dict von unerwünschten Elementen zu befreien, dann mit sorted Funktion mit Taste, um die Artikel von wordcount zu sortieren und schließlich die dict bauen mit OrderedDict

Mit einfachen in nur für Teilzeichen zu überprüfen, müssen regex verwenden, wenn wollen genaue Übereinstimmung voller Wortgrenze kümmern

from collections import OrderedDict 
ngram_dict = { 
    'back to back breeding': {'wordcount': 4, 'count': 3}, 
    'back breeding': {'wordcount': 2, 'count': 5}, 
    'several consecutive heats': {'wordcount': 3, 'count': 2}, 
    'how often should': {'wordcount': 3, 'count': 2}, 
    'often when breeding': {'wordcount': 3, 'count': 1} 
} 

# ngram items with unwanted items filter out 
ngram_filter = [i for i in ngram_dict.items() if not any(i[0] in k and i[0] != k for k in ngram_dict.keys())] 
final_dict = OrderedDict(sorted(ngram_filter, key=lambda x:x[1].get('wordcount'))) 

# final_dict = OrderedDict([('several consecutive heats', {'count': 2, 'wordcount': 3}), ('how often should', {'count': 2, 'wordcount': 3}), ('often when breeding', {'count': 1, 'wordcount': 3}), ('back to back breeding', {'count': 3, 'wordcount': 4})]) 

All dies kann in 1-Liner wie unten

from collections import OrderedDict 
final_dict = OrderedDict( 
sorted((i for i in ngram_dict.items() if not any(i[0] in k and i[0] != k for k in ngram_dict.keys())), 
key=lambda x:x[1].get('wordcount'))) 
Verwandte Themen