2016-06-13 10 views
0

stelle ich ein OrderedDict und Wörterbuch Comprehensions mit unterschiedlichen Grammatiken ausführen, die ich auf eine Funktion dictcomp(fn, dictionary, key_or_value): vereinfachte: das WörterbuchOrderedDict ändern Sortieren nach Doppel Iterator Schleife

x = OrderedDict(self._Median_Colors) 
    x = self.dictcomp(hex2color, x, 'v') 
    x = self.dictcomp(rgb_to_hsv, x, 'v_tuple') 

An dieser Stelle ich in der Lage bin zu sortieren:

x = self.dictcomp(self.sort_by_hue, x, 'v') 

Alles scheint so weit zu überprüfen:

print x 

Jetzt brauche ich Schlüssel umbenennen, also werde ich ein neues bestellt Wörterbuch erstellen:

color_indexes = list(xrange(0, len(x.keys()))) 
    print color_indexes 

    newkeys = [self.rename(color_index) for color_index in color_indexes] 

    print x.values() 
    vi = iter(x.values()) 
    x = OrderedDict.fromkeys(newkeys); 

Ich hatte keine Ahnung, wie man sofort in den alten Werten zu füllen, so dass ich tat dies:

ki = iter(x.keys()) 
    for k, v in zip(ki, vi): 
     #print "k:", k 
     print v 
     x[k] = tuple(v) 

checkt fein:

print x.items() 

kommt Mühe:

x = self.dictcomp(hsv_to_rgb, x, 'v_tuple') 
    print x.items() 

wo dictcomp dies tut:

dictionary = {k: fn(*v) for k, v in dictionary.items()} 

wo fn=hsv_to_rgb, dictionary=x

Jetzt habe ich:

[('Blue', (0.9764705882352941, 0.5529411764705883, 0.0)), .... 

statt der erwarteten:

[('Red', (0.4745098039215686, 0.7372549019607844, 0.23137254901960794)), .... 

Die Tasten sind das Gleiche, aber die Werte haben sich geändert. Ich vermute, dass der Anzeigenauftrag irgendwie betroffen war. Wie ist das passiert und wie kann ich die Reihenfolge der Schlüssel im Wörterbuch beibehalten?

Antwort

0

Das Problem ist wegen

for i, j in zip([4, 5, 6], [1, 2, 3]): 
    print i 
    print j 

Ergebnisse in der Spalte:

4 1 5 2 6 3

Es stellt sich heraus, dass zip wirkt als Reißverschluss zwei Iteratoren bei Verwendung.

Das Update ist das Schlüsselwort-Wert als iterable Tupel zu erhalten:

for i in zip([4, 5, 6], [1, 2, 3]): 
    print i 

Returns

(4, 1) 
(5, 2) 
(6, 3)