2016-06-04 8 views
0

Ich möchte alle Werte im Wörterbuch in andere ändern. Zum Beispiel in einem WörterbuchÄndern vieler Werte im Wörterbuch ohne Verwendung des Schlüsselnamens

dic = {'a': 1, 'b':2, 'c':3, 'd':4, 'e': 5, 'f':6} 
lst = [100, 200, 300, 400, 500, 600] 

I dic ‚s Werte in Zahlen in lst wie dic = {'a': 100 ,'b': 200 ... } ändern möchten.

Gibt es eine Möglichkeit, alle Werte zu ändern, ohne den Namen der Schlüssel zu verwenden? Die Länge meines tatsächlichen Wörterbuchs ist ungefähr 100.

+2

Da Wörterbücher keine Reihenfolge haben, wie möchten Sie "b" mit 200 verbinden? Wären Sie mit den Schlüsseln in sortierter Reihenfolge in Ordnung, oder kümmert es Sie überhaupt nicht um den Auftrag? (Z. B. würden Sie mit '{" b ": 100," a ": 200}' okay sein.) – DSM

+0

Ich möchte in Ordnung halten. in meiner tatsächlichen Arbeit bedeutet "a" die erste, "b" bedeutet die zweite und usw. –

+1

Wörterbücher haben keine Reihenfolge zu pflegen. Das ist kein Problem, wenn Sie eine Operation für die Werte unabhängig von der Reihenfolge durchführen möchten (die nicht existiert), wie sie mit 100 multipliziert werden, aber es wird ein Problem sein, wenn Sie eine separate Liste haben, die Sie haben gebaut. – DSM

Antwort

4

Wenn Sie jede Zahl im dict mit 100 multiplizieren müssen, können Sie alle Werte auf einmal durchlaufen, indem Sie dict comprehension verwenden.

dic = {'a': 1, 'b':2, 'c':3, 'd':4, 'e': 5, 'f':6} 
dic = {k: v*100 for k, v in dic.items()} 

Wenn Sie die Zahlen der Liste speziell auf Buchstaben im Alphabet (in derselben Reihenfolge) zugeordnet werden, you can zip your list with small caps letters, und benutzen Sie diese list Ihre bauen dict:

from string import ascii_lowercase 

# you can do this with a dict comprehension 
dic = {k: v for (k, v) in zip(ascii_lowercase, lst)} 

# or equivalently, call the dict() built-in function 
dic = dict(zip(ascii_lowercase, lst)) 

In In diesem letzten Beispiel wird die Reihenfolge Ihrer Liste in der Reihenfolge der Buchstaben des Alphabets wiedergegeben. So dass a100 sein wird, wird b200 sein usw.

Aber man kann nicht ein dict erinnern, es ist „Ordnung“ machen. Es gibt keine Reihenfolge in einem dict, Sie können nur die Werte auswählen und sie einzeln festlegen, nicht durchlaufen sie mit einer garantierten Reihenfolge (wie in einer anderen Antwort angegeben, würden Sie OrderedDict dafür benötigen).

+0

Vielen Dank für Ihre Antwort !!!! Aber in meiner ursprünglichen Arbeit sind die Werte nicht 100,200,300,400,500,600 ... tatsächlich sind es 23,554, 35,124, 35,222 wie diese. Kein Muster. Denke, es ist mein Fehler, eine Frage zu stellen –

+0

@SunwooLim Das ist wirklich das Problem hier wie bereits erwähnt in den vorherigen Kommentaren. Dicts behalten die Reihenfolge nicht bei, daher funktioniert sie nur, wenn die Funktion für alle Werte konstant ist. Andernfalls erhalten Sie jedes Mal, wenn Sie es ausführen, unterschiedliche Ergebnisse. – Chris

+0

@Chris 'dic = {k: v für (k, v) in zip (ascii_lowercase, lst)}' gibt jedes Mal die gleichen Ergebnisse - nur sie werden in einer anderen Reihenfolge angezeigt, aber 'dic ['a'] 'wird immer gleich '100' sein (im Beispiel des OP) – Jivan

0

Kurze Antwort: Nein, Wörterbücher sind nicht in Python angeordnet, daher gibt es keine einfache Möglichkeit, Werte zu vergleichen.

Längere Antwort: Sortieren, können Sie Bestellte Wörterbücher verwendet werden.

dic={'a': 1, 'b':2, 'c':3, 'd':4, 'e': 5, 'f':6} 
o_dic = OrderedDict(sorted(dic.items(), key=lambda t: t[0])) 
lst=[100,200,300,400,500,600] 

for index, key in enumerate(o_dic.keys()): 
    o_dic[key] = lst[index] 
Verwandte Themen