Konvertieren Sie eine Liste in ein Wörterbuch in Python


189

Angenommen, ich habe eine Liste ain Python, deren Einträge bequem einem Wörterbuch zugeordnet sind. Jedes gerade Element stellt den Schlüssel zum Wörterbuch dar, und das folgende ungerade Element ist der Wert

beispielsweise,

a = ['hello','world','1','2']

und ich möchte es in ein Wörterbuch konvertieren b, wo

b['hello'] = 'world'
b['1'] = '2'

Was ist der syntaktisch sauberste Weg, um dies zu erreichen?


Antworten:


269
b = dict(zip(a[::2], a[1::2]))

Wenn aes groß ist, möchten Sie wahrscheinlich Folgendes tun, wodurch keine temporären Listen wie die oben genannten erstellt werden.

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

In Python 3 könnten Sie auch ein Diktatverständnis verwenden, aber ironischerweise denke ich, dass der einfachste Weg, dies zu tun, mit range()und ist len(), was normalerweise ein Codegeruch wäre.

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

Daher ist die iter()/izip()Methode in Python 3 wahrscheinlich immer noch die pythonischste, obwohl sie, wie EOL in einem Kommentar feststellt, zip()in Python 3 bereits faul ist, sodass Sie sie nicht benötigen izip().

i = iter(a)
b = dict(zip(i, i))

Wenn du es in einer Zeile haben willst, musst du schummeln und ein Semikolon verwenden. ;-);


9
… Oder einfach zip(i, i)in Python 3, da zip()jetzt ein Iterator zurückgegeben wird.
Eric O Lebigot

5
Beachten Sie, dass Python 2.7.3 auch ein Diktatverständnis hat
user1438003

56

Einfache Antwort

Eine weitere Option (mit freundlicher Genehmigung von Alex Martelli - Quelle ):

dict(x[i:i+2] for i in range(0, len(x), 2))

Verwandte Anmerkung

Wenn Sie dies haben:

a = ['bi','double','duo','two']

und Sie möchten dies (jedes Element der Liste gibt einen bestimmten Wert ein (in diesem Fall 2)):

{'bi':2,'double':2,'duo':2,'two':2}

Sie können verwenden:

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}

2
Ist das nur für Python 3?
Tagar

2
verwenden fromkeys. >>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Gdogg

1
Dies ist etwas anderes als das, was die Frage stellt.
Ozn

17

Sie können hierfür ganz einfach ein Diktatverständnis verwenden:

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

Dies entspricht der folgenden for-Schleife:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]

10

Etwas, das ich ziemlich cool finde, das heißt, wenn deine Liste nur 2 Elemente lang ist:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

Denken Sie daran, dass dict jedes iterable akzeptiert, das ein iterable enthält, wobei jedes Element in der iterable selbst ein iterable mit genau zwei Objekten sein muss.


schnell und einfach, nur um hinzuzufügen, wenn die Liste mehr als zwei Elemente enthält, verwenden Sie dict (ls) anstelle von dict ([ls]). Zum Beispiel, wenn ls = ['a', 'b', 'c', 'd'], dann diktiere (ls)
ankit tyagi

1
Schön und schlank. "Jedes Element in der Iterable muss selbst eine Iterable mit genau zwei Objekten sein." ist hier die entscheidende Tatsache.
Abhijeet

4

Vielleicht nicht die pythonischste, aber

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]

10
Lesen Sie mehr überenumerate
SilentGhost

5
Mit enumerate können Sie keine Schrittgröße angeben, die Sie jedoch verwenden können for i, key in enumerate(a[::2]):. Immer noch unpythonisch, da der Diktatkonstrukteur den größten Teil der Arbeit hier für Sie erledigen kann
John La Rooy

@ SilentGhost, Gnibbler: Vielen Dank, dass du meinen Horizont erweitert hast! Ich werde es in Zukunft so weit wie möglich einbauen!
Sahhhm

@gnibbler: Könntest du etwas mehr darüber erklären, wie der for i, key in enumerate(a[::2]):Ansatz funktionieren könnte? Die resultierenden Paarwerte wären 0 hellound 1 1, und es ist mir unklar, wie ich sie zum Produzieren verwenden soll {'hello':'world', '1':'2'}.
Martineau

1
@martineau, du bist richtig. Ich denke, ich muss gemeint habenenumerate(a)[::2]
John La Rooy

4

Sie können dies ziemlich schnell tun, ohne zusätzliche Arrays zu erstellen, sodass dies auch für sehr große Arrays funktioniert:

dict(izip(*([iter(a)]*2)))

Wenn Sie einen Generator haben a, noch besser:

dict(izip(*([a]*2)))

Hier ist der Überblick:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary

Dadurch wird ein Wörterbuch mit gleichen Schlüssel- und Wertepaaren erstellt ( {'hello':'hello','world':'world','1':'1','2':'2'})
mik

Nein, alle funktionieren gut. Bitte lesen Sie genauer. Es heißt: "Wenn Sie einen Generator haben ..." Wenn Sie keinen Generator haben, verwenden Sie einfach die erste Zeile. Die zweite ist eine Alternative, die nützlich wäre, wenn Sie einen Generator anstelle einer Liste haben, wie dies die meiste Zeit der Fall wäre.
Topkara

1

Sie können es auch so machen (Konvertierung von Zeichenfolge zu Liste hier, dann Konvertierung in ein Wörterbuch)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list


0

Ich bin nicht sicher, ob dies pythonisch ist, aber es scheint zu funktionieren

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))

0

Versuchen Sie den folgenden Code:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}

0

Sie können diesen Ansatz auch ausprobieren, indem Sie die Schlüssel und Werte in einer anderen Liste speichern und dann die dict-Methode verwenden

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

Ausgabe:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}

0
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.