1734 Stimmen

Wie kann ich zwei Listen in ein Wörterbuch umwandeln?

Ich möchte sie kombinieren:

keys = ['name', 'age', 'food']
values = ['Monty', 42, 'spam']

In ein einziges Wörterbuch:

{'name': 'Monty', 'age': 42, 'food': 'spam'}

4voto

AbstProcDo Punkte 17041
  • 2018-04-18

Die beste Lösung ist immer noch:

In [92]: keys = ('name', 'age', 'food')
...: values = ('Monty', 42, 'spam')
...: 

In [93]: dt = dict(zip(keys, values))
In [94]: dt
Out[94]: {'age': 42, 'food': 'spam', 'name': 'Monty'}

Umstellen:

    lst = [('name', 'Monty'), ('age', 42), ('food', 'spam')]
    keys, values = zip(*lst)
    In [101]: keys
    Out[101]: ('name', 'age', 'food')
    In [102]: values
    Out[102]: ('Monty', 42, 'spam')

4voto

Mayank Prakash Punkte 61

Ich hatte diesen Zweifel, als ich versuchte, ein Problem im Zusammenhang mit einem Diagramm zu lösen. Das Problem, das ich hatte, war, dass ich eine leere Adjazenzliste definieren musste und alle Knoten mit einer leeren Liste initialisieren wollte. Da dachte ich, wie wäre es, wenn ich prüfe, ob das schnell genug ist, ich meine, ob es sich lohnt, eine Zip-Operation durchzuführen, anstatt einfach ein Schlüssel-Wert-Paar zuzuweisen. Schließlich ist der Zeitfaktor in den meisten Fällen ein wichtiger Eisbrecher. Also habe ich die timeit-Operation für beide Ansätze durchgeführt.

import timeit
def dictionary_creation(n_nodes):
    dummy_dict = dict()
    for node in range(n_nodes):
        dummy_dict[node] = []
    return dummy_dict

def dictionary_creation_1(n_nodes):
    keys = list(range(n_nodes))
    values = [[] for i in range(n_nodes)]
    graph = dict(zip(keys, values))
    return graph

def wrapper(func, *args, **kwargs):
    def wrapped():
        return func(*args, **kwargs)
    return wrapped

iteration = wrapper(dictionary_creation, n_nodes)
shorthand = wrapper(dictionary_creation_1, n_nodes)

for trail in range(1, 8):
    print(f'Itertion: {timeit.timeit(iteration, number=trails)}\nShorthand: {timeit.timeit(shorthand, number=trails)}')

Für n_Knoten = 10.000.000 erhalte ich,

Iteration: 2.825081646999024 Kurzschrift: 3,535717916001886

Iteration: 5.051560923002398 Kurzschrift: 6,255070794999483

Iteration: 6.52859034499852 Kurzschrift: 8.221581164998497

Iteration: 8.683652416999394 Kurzschrift: 12,599181543999293

Iteration: 11.587241565001023 Kurzschrift: 15,27298851100204

Iteration: 14.816342867001367 Kurzschrift: 17.162912737003353

Iteration: 16.645022411001264 Kurzschrift: 19,976680120998935

Es ist deutlich zu erkennen, dass ab einem bestimmten Punkt der Iterationsansatz im n_ten Schritt die Zeit, die der Kurzschriftansatz im n-1_ten Schritt benötigt, überholt.

3voto

Akash Nayak Punkte 757

Können Sie den unten stehenden Code verwenden:

dict(zip(['name', 'age', 'food'], ['Monty', 42, 'spam']))

Aber stellen Sie sicher, dass die Länge der Listen gleich ist. Wenn die Länge nicht gleich ist, dann schaltet die Zip-Funktion die längere Liste ein.

1voto

DonkeyKong Punkte 885

Wenn Sie mit mehr als 1 Satz von Werten arbeiten und eine Liste von Diktaten können Sie dies verwenden:

def as_dict_list(data: list, columns: list):
    return [dict((zip(columns, row))) for row in data]

Ein Beispiel aus der Praxis wäre eine Liste von Tupeln aus einer Datenbankabfrage, die mit einem Tupel von Spalten aus derselben Abfrage gepaart ist. Andere Antworten werden nur für 1 zu 1 gegeben.

0 Stimmen

Gibt es einen Grund für die doppelten Klammern um den Aufruf von zip()?

0voto

Zeinab Mardi Punkte 125
keys = ['name', 'age', 'food']
values = ['Monty', 42, 'spam']
dic = {}
c = 0
for i in keys:
    dic[i] = values[c]
    c += 1

print(dic)
{'name': 'Monty', 'age': 42, 'food': 'spam'}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X