5

Ich experimentiere mit Python und stehe dabei, die Fehlermeldungen im Zusammenhang zu verstehen, was ich mache.Umrissen mit mehreren Eingabesätzen

Ich spiele um mit Comprehensions und zu versuchen, ein Muster zu finden eine Liste/Wörterbuch Verständnis mit mehr als einem Eingang gesetzt zu erstellen (vorausgesetzt, dies möglich ist):

Hinweis: Hier wird das Wort Eingang Set bedeutet den Eingabebereich des Verständnisses. In der Setbuilder-Notation, von der Python seine Comprehensions [Y für X in LIST] abgeleitet hat, ist Y die Ausgabefunktion, X ist die Variable und LIST ist die Eingabesatz.

Angenommen ich folgende Arbeitscode:

from random import randint 

mydict = {k: 0 for k in range(10)} 
result = {randint(0,9): v + 1 for v in mydict.values()} 

bin ich nicht speziell darüber, etwas zu tun versuchen. Dies ist nicht einmal nützlicher Code, weil er nicht wie erwartet funktioniert. Alle Elemente im Wörterbuch haben den Wert 1 und nicht nur die Elemente, auf die der Zufallsgenerator zeigt. Mein einziges Ziel ist es, eine Basis zu haben, von wo aus ich meinen Versuch beginne, mit einem Tupel von Eingabesätzen zu arbeiten.

from random import randint 

mydict = {k: 0 for k in range(10)} 
result = {k: v + 1 for k, v in (randint(0,9), mydict.values())} 

Diese Option gibt mir: TypeError: 'int' object is not iterable.

Durch die Eingangssätze Swapping und ich habe Auspacken:

result = {k: v + 1 for *v, k in (mydict.values(), randint(0,9))} 

Aber diese Option gebe ich: TypeError: can only concatenate list (not "int") to list

Sind diese Fehler erscheinen, weil ich etwas die Sprache Grammatik nicht versteht, zu tun versuchen, oder fehle ich etwas und ich könnte tatsächlich den Code reparieren?

+4

Es ist nicht klar, welche Ausgabe Sie * * erwarten. Sage 'randint (0,9)' gab 3 zurück; Welches "Ergebnis" würdest du haben wollen? – DSM

+0

Möchten Sie ein Diktat mit Schlüsseln von 'range (10)' und zufälligen Werten von 'randint'? – Navith

+1

Sie sind auf die Absicht des Codes konzentriert. Die einzige Absicht hier ist zu sehen, ob es einen Weg gibt, ein Tupel von Eingabesätzen in einem Verständnis zu haben. Der Code ist nur meine Basis für Experimente. –

Antwort

7

Sie müssen ein separates Verständnis für die Zufallszahlen erstellen, wie es derzeit steht, haben Sie nur eine Zufallszahl. Außerdem werden Sie dann die Ergebnisse zip müssen, um eine neue Einheit zu erhalten:

>>> from random import randint 
>>> mydict = {k: 0 for k in range(10)} 
>>> result = {k: v + 1 for k, v in zip([randint(0,9) for _ in range(10)] , mydict.values())} 
>>> result 
{2: 1, 3: 1, 4: 1, 5: 1, 8: 1, 9: 1} 

Beachten Sie, dass seit Ihrem ersten dict den Wert 0 für alle seine Schlüssel hat, werden alle Werte in den Ergebnis dict sind 1 (0+1) .

Auch, da wir die Schlüssel zufällig machen, kann es mögliche Überlappungen geben (sagen wir 2 wurde zweimal generiert), deshalb sehen wir nicht alle Schlüssel im result Wörterbuch.

Wie @wim unten in den Kommentaren anmerkt, ein besserer Weg, um dieses Ergebnis Wörterbuch generieren würde zu verwenden sein:

>>> {randint(0,9): v+1 for v in mydict.values()} 
{0: 1, 1: 1, 2: 1, 3: 1, 6: 1, 7: 1} 
+2

Das ist ein seltsamer Weg zu gehen darüber. Sie können auch einfach randint (0, 9) als k eingeben und nur das v in das Verständnis einschließen. – wim

+1

@wim Das stimmt, ich war darauf konzentriert, OP was mit dem aktuellen Code falsch zu sagen ... –

+1

Das ist erstaunlich, mu! Danke, dass Sie mir geholfen haben, herauszufinden, wo ich falsch gelaufen bin. @wim, das ist nur ein Experiment. Die wahre Absicht war, zu versuchen, einen Weg zu finden, ein Tupel von Eingabesätzen zu haben –