verwenden Sie einen Bereich als dictionary-Schlüssel in Python, welche option habe ich?
Dies ist mein Erster Beitrag und ich bin Recht neu beim Programmieren, so könnte ich nicht in der Lage sein, zu vermitteln, meine Frage angemessen, aber ich werde mein bestes tun!
tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
ub_tries = user input
tries = 1
input ('\nCome on make your ' + tries_dict.get(tries) + guess: ')
Diese 3 Elemente sind Teil einer Zahl erraten Spiel, das ich geschaffen, und ich enthalten Sie in einem while
Schleife, wo tries += 1
nach jeder falschen Antwort.
Wie Sie sehen können, in meinem Wörterbuch gibt es eigene Werte für die erste 4 Antworten und die Letzte chance, bevor das Spiel vorbei ist, also hier ist was ich versucht habe:
Ich wollte einen Weg finden, um die 'NÄCHSTE' - Wert für jede Antwort/Schlüssel zwischen der 'vierten' und 'last'.
In:
tries = 5
Come on make your next guess
tries = 6
Come on make your next guess
und so weiter
Habe ich einen Weg finden, mit einigen komplexen Schleifen, aber der neugierige Typ, ich wollte wissen effizienter/praktische Möglichkeiten, dies zu erreichen.
Hier sind einige Möglichkeiten, ich dachte darüber nach, konnte Sie aber nicht bekommen, um zu arbeiten:
- Mit einer Reihe als Schlüssel
- Einen Weg zu finden, um eine Liste mit Werten zwischen 4 und
ub_tries
und mit dieser Liste als Schlüssel
So generell: wie kann man es schaffen, eine Möglichkeit zu haben, diese Allgemeine Antwort (in der nächsten oder was auch immer) für Schlüssel, die nicht in einem Wörterbuch?
Jedes feedback würde sehr geschätzt werden, fühlen Sie sich frei, um Erklärungen zu bitten, da kann ich mir, meine Frage ist irgendwie chaotisch.
Ich hoffe ich bekomme mehr crafty sowohl bei der Programmierung und zu Fragen Verwandte Fragen, so weit meine Programmierung ist fast so chaotisch wie meine Zusammenfassung Fähigkeiten, seufz!
- Sind Sie gerade auf der Suche nach:
tries_dict.get(tries, 'next')
? - PS, die Sie verwenden können, eine
range
als Schlüssel (das ist in Python 3 und Python 2, es ist einxrange
), aber ich sehe nicht, wie, hilft dir hier. Sie würden dann einenrange
zu tun, die später lookups, und wo sollte dieser herkommen? - ich weiß nicht wirklich den Punkt über dict.bekommen, es ist keine Taste für "weiter", also wie könnte ich es bekommen? nun, ich habe darüber nachgedacht, über einen Bereich, wie in range (5,ub_tries), diesen Bereich der Arbeit als Schlüssel für den Wert 'Weiter'
- Haben Sie Lesen Sie meine Antwort? Die Idee ist, dass
'next'
ist der Standardwert, der Sie wieder für jede Taste, die Sie noch nicht definiert ist, einen Wert für. So bekommen Sie es durch den Aufrufget
mit jedem Wert außer 1, 2, 3, 4, oderub_tries
. Das ist genau das, was Sie wollen, richtig? - Inzwischen, wenn Sie
range(5, ub_tries)
wie einen Schlüssel, das ist in Ordnung, aber wie wird es helfen? Zum Beispieltries_dict[range(5, ub_tries)] = 'next'
ist in Ordnung, aber danntries_dict[6]
ist immer noch einKeyError
, weil6
ist nicht der gleiche Schlüssel wierange(5, ub_tries)
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, ob dies ist, was Sie wollen, aber
dict.get
kann die Antwort sein:Natürlich können Sie wickeln Sie diese in eine Funktion, in verschiedenen wegen. Zum Beispiel:
Jedenfalls
dict.get(key, default=None)
ist wiedict[key]
, außer dass, wennkey
ist nicht Mitglied, anstelle der Erhöhung einKeyError
es gibtdefault
.Als für deine Vorschläge:
Sicher, Sie können tun, dass (wenn Sie in Python 2 statt 3 verwenden Sie
xrange
fürrange
), aber wie würde es helfen?Das ist völlig legal—aber
d[6]
wird sich erhöhen, einKeyError
, weil6
ist nicht das gleiche wierange(5, ub_tries)
.Wenn Sie wollen, dass dies funktioniert, können Sie bauen eine
RangeDictionary
wie diese:Aber auch über "Anfänger " Python", auch für dieses schrecklich ineffizient, unvollständig, und nicht-robuste Implementierung, also ich würde nicht empfehlen es.
Meinst du wie diese?
Funktioniert, aber es ist wahrscheinlich nicht so eine gute Lösung.
Schließlich könnten Sie
defaultdict
können Sie Backen Sie den Standardwert in das Wörterbuch, anstatt die, die Sie als Teil jeder Anruf:Beachten Sie jedoch, dass dies dauerhaft schafft jedes element das erste mal, wenn Sie danach Fragen—und Sie müssen eine Funktion erstellen, gibt den default-Wert. Dies macht es nützlich für die Fälle, wo Sie gehen, um die Aktualisierung der Werte, und wollen einfach nur eine Standard-als Ausgangspunkt.
get
bedeutet. Und ja, ein Aufruf an dieget
Methode, wie bei jedem anderen Funktionsaufruf ist ein Ausdruck, so kann es überall dort verwendet, wo ein Ausdruck verwendet werden kann, einschließlich in der Mitte eines Ausdrucks hinzufügen von strings zusammen in einen parameter für einen Aufruf einer anderen Funktion, wieinput
.import
ist wirklich einfach, und etwas, das Sie sollten lernen, Recht früh. Allerdingsdefaultdict
ist nicht, die einfach—man sollte das wohl nicht werden lernenlambda
noch, zum Beispiel. Also ich Stimme zu, es ist nicht die beste Lösung für Sie.Habe ich gefangen, Ihre Absicht für das Spiel hier?
gibt
input
heißtraw_input
in Python 2 und Python 3 istrange
heißtxrange
in Python 2. Wenn Sie lernen Python 3 ist, brauchen Sie nicht zu befürchten, dass gerade jetzt—außer natürlich, dass Sie haben, um die Antworten zu Lesen, die Leute haben geschrieben für Python 2. (Das hinzufügen derpython3
tag und/oder die Erwähnung des Python-version, die in Ihrer Frage helfen mit, dass.)Warum verwenden Sie nicht nur eine Liste?
Hinweis: dieser code funktioniert nicht wie geplant für
MAX_TRIES = 0
, aber ich denke nicht, dass das ein problem sein wird.["next"] * (max_tries - len(tries_list))
ist eine Liste vonmax_tries - len(tries_list)
Kopien der Zeichenfolge"next"
. Also, wennmax_tries=20
undtries_list
ist, die 9-element-Liste wird in der Antwort, es habe 11 Kopien der Zeichenfolge"next"
. Wenn Sie hinzufügen, dass die 9-elementtries_list
erhalten Sie eine 20-element-Liste, wo die ersten 9 kommen austries_list
und die next 11 sind alle"next"
. Zu erhalten genau, was Sie wollen, Sie würde wollen, dassmax_tries - len(tries_list) - 1
, und fügen Sie dann["last"]
zu Ende.enumerate
Funktion. Sie tun kannfor i, name in enumerate(tries_list... + ["last"])
, und danni+1
ist die Anzahl der aktuellen versuche.try
ist ein reserviertes Wort. Sie müssen sich also ändern Sie den Namen der Variablen (und vielleicht auch andere Dinge, denn dieser war offensichtlich nicht wirklich getestet, oder das Plakat wird bemerkt haben, dass es nicht funktioniert).Können Sie ein Wörterbuch mit range als ein Schlüssel:
Hoffe, das hilft. 🙂