2017-11-21 2 views
1

Mein Wörterbuch Werte sind wie folgt aus:Erste mindestens drei Werte im inneren Wörterbuch (Python 3.4)

manhattan[imagePath1][imagePath2] = img2manhattan.

Also wie kann ich Schlüssel von mindestens drei Werten als Liste bekommen? (Unter imagePath2 Tasten)

(Ich möchte zuerst kleinste Wert Schlüssel + Schlüssel bekommen von zweitkleinsten Wert + Taste der drittkleinsten Wert als Liste.)

+0

Ist das das Minimum für jeden inneren Wörterbuch oder das Minimum über alle inneren Wörterbücher? –

+0

Siehe [** 'heapq.nsmallest' **] (https://docs.python.org/3/library/heapq.html#heapq.nsmallest) –

+0

Können Sie ein Beispiel für Ein- und Ausgänge geben? Sehen Sie, wie Sie ein [mcve] erstellen. –

Antwort

1

ich würde es auf diese Weise tun:

d = dict(manhattan[imagePath1][imagePath2]) 
min_keys = [] 
for i in xrange(3): 
    min_keys.append(min(d,key=d.get)) 
    del d[min_keys[-1]] 

Danach enthalten min_keys, was Sie brauchen.

+0

auf diese Weise löschen Min Werte jeweils, wie ich es verstehe, und ich möchte keine Änderungen im Wörterbuch –

+0

Ja mein schlechtes tun ! Ich bearbeite meine Antwort so, dass die Werte nur in einem temporären Wörterbuch und nicht im Original gelöscht werden. – hezanathos

0

können Sie verwenden heapq.nsmallest:

import heapq 

manhattan = {'path1_a': {'path2_a': 1, 
         'path2_b': 5}, 
      'path1_b': {'path2_c': 3, 
         'path2_d': 7}, 
      'path1_c': {'path2_e': 4, 
         'path2_f': 9}} 

print heapq.nsmallest(3, 
         ((path1, path2, value) 
         for path1, path2s in manhattan.items() 
         for path2, value in path2s.items()), 
         key=lambda (path1, path2, value): value) 

Ausgang:

[('path1_a', 'path2_a', 1), 
('path1_b', 'path2_c', 3), 
('path1_c', 'path2_e', 4)] 
+0

Thx für Probe, aber ich möchte erhalten "path2_a", "path2_c", "path2_e" jeweils als Liste. (der kleinste drei Wert in der Manhattan [Schlüssel], die der "Schlüssel" iteriert in path1_a, path1_b ...) –

0

Sie einige Beispiele liefern Sollte Eingang und Ausgang zu erwarten, wenn möglich bitte Ihre Frage mit diesen Informationen bearbeiten, wird hier mit @ Peter Beispieldaten versucht:

Eine Linie Lösung:

#data from @peter 
manhattan = {'path1_a': {'path2_a': 1, 
         'path2_b': 5}, 
      'path1_b': {'path2_c': 3, 
         'path2_d': 7}, 
      'path1_c': {'path2_e': 4, 
         'path2_f': 9}} 

print(["".join([key for key, value in item.items() if value == min(item.values())])for item in manhattan.values()]) 

Ausgabe:

['path2_e', 'path2_a', 'path2_c'] 

Detaillierte Lösung:

final_list=[] 
for item in manhattan.values(): 
    for key,value in item.items(): 
     if value == min(item.values()): 
      final_list.append(key) 

print(final_list) 

Ausgang:

['path2_c', 'path2_e', 'path2_a'] 
Verwandte Themen