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?

Mike
quelle
3
Mögliches Duplikat von Make Dictionary aus Liste mit Python
Jeru Luke

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. ;-);

irgendwie
quelle
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}
JobJob
quelle
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]
Chris Arena
quelle
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.

rix
quelle
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]
sahhhm
quelle
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
Topkara
quelle
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
Stefan Gruenwald
quelle
1

Ich bin auch sehr daran interessiert, einen Einzeiler für diese Konvertierung zu haben, da eine solche Liste der Standardinitialisierer für Hash in Perl ist.

In diesem Thread wird eine außergewöhnlich umfassende Antwort gegeben -

Meins (ich bin ein Neuling in Python), das Python 2.7 Generator Expressions verwendet , wäre:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

Oleksiy
quelle
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))
Manu
quelle
0

Versuchen Sie den folgenden Code:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}
Muhammed
quelle
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'}
Aaditya Ura
quelle
0
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}
Mahdi Ghelichi
quelle