Nach was ich suche, ist der beste Weg zu sagen: 'Wenn diese Liste zu kurz ist, verlängere sie auf 9 Elemente und füge' Wahl 4 ',' Wahl 5 'usw. als zusätzliche Elemente hinzu. Ersetzen Sie außerdem alle 'None'-Elemente durch' Choice x '.' Es ist in Ordnung, auch "" und "0" zu ersetzen.
Eine Beispieltransformation wäre
%Vor%bis
%Vor%Mein ursprünglicher Code missbrauchte try / except und hatte einen Fehler, den ich nicht bemerkte; Danke an Joeforker und alle, die darauf hingewiesen haben. Basierend auf den Kommentaren habe ich zwei kurze Lösungen ausprobiert, die genauso gut funktionieren:
%Vor%und
%Vor%Ich denke # 2 gewinnt, weil es pythonischer ist, also ist es derjenige, den ich benutzen werde. Es ist leicht zu verstehen und verwendet gängige Konstrukte. Das Aufteilen der Schritte ist logisch und würde es für jemanden einfacher machen, es auf einen Blick zu verstehen.
Meine erste Reaktion war, die Listenerweiterung aufzuteilen und die Lücken so in einzelne Teile aufzufüllen:
%Vor% Wenn Sie bei der Methode try...except
bleiben, fangen Sie eine bestimmte Ausnahme als Douglas zeigt. Andernfalls werden Sie alles erfassen: KeyboardInterrupts
, RuntimeErrors
, SyntaxErrors
, .... Du willst das nicht machen.
BEARBEITEN: Fehler bei der 1-Indexliste behoben - danke DNS !
BEARBEITEN: alternative Listenerweiterung hinzugefügt
Ich denke, ich würde etwas so ziemlich machen, aber mit ein paar aufgeräumten Ups:
%Vor% Von denen die einzigen zwei wichtig sind, nur IndexError
und keine Ausnahme zu fangen und von 0 zu indexieren.
Und das einzige wirkliche Problem mit dem Original wäre, wenn choicesTxt
leer ist, wenn die hinzugefügten Optionen um eins aus sind.
Ich denke, Sie sollten die Größenänderung des Arrays als separaten Schritt behandeln. Um dies zu tun, rufen Sie choicesTxt=choicesTxt+[None]*(10-len(choicesTxt))
auf, falls das Array zu kurz ist.
Die None
choice-Neuzuordnung kann mithilfe von List Comprehensions erfolgen.
Ich bin ein wenig unklar darüber, warum Sie Reichweite (1, 10) verwenden; Da du ChoiceTXT [i] verwendest, überspringt das die None-Prüfung für das erste Element in deiner Liste.
Es gibt natürlich auch einfachere Möglichkeiten, dies zu tun, wenn Sie eine neue Liste erstellen, aber Sie möchten ausdrücklich zu einer vorhandenen Liste hinzufügen.
Ich glaube nicht, dass das wirklich sauberer oder schneller ist, aber es ist eine andere Idee, über die Sie nachdenken sollten.
%Vor%Was ist damit? (scheint ein Diktat zu sein - keine Liste - wenn es unvollständig ist)
%Vor%Noch einmal bearbeiten: Wenn es wirklich eine Liste ist (kein Diktat):
%Vor%braucht Python 2.5 Ich denke (wegen des ternären Operators)?
(Dank Joeforfer behoben, dass es Tasten 1 bis 10 und nicht 0 bis 10 mehr verwendet; dank SilentGhost: in ist mehr Python als has_key () oder len ())
Wenn es Ihnen nichts ausmacht, alles, was mit False ausgewertet wird, mit "Choice% d" zu ersetzen, dann funktioniert result
für Python 2.4.
Wenn Sie etwas dagegen haben und Python 2.5 und höher verwenden, dann verwenden Sie result2_5_plus
mit der Potenz von ternary if
.
Wenn Sie Ternär nicht mögen oder nicht verwenden können, dann nutzen Sie die Tatsache, dass True == 1
und False == 0
das Ergebnis von x is None
verwenden, um eine Liste zu indizieren.
Nun in einer Zeile:
%pr_e%
Obwohl das alles ersetzen wird, was False ergibt (z. B. None, '', 0 usw.) mit "Choice n". Am besten ersetzen Sie "a or 'Choice %d' % i"
durch eine Funktion, wenn Sie das nicht wollen.
Der Schlüssel ist, dass map
mit einem Argument von None verwendet werden kann, um die Liste auf die Länge zu erweitern, die mit None an den erforderlichen Stellen benötigt wird.
Eine sauberere (mehr pythische) Version wäre:
%pr_e%
Wenn es in Ordnung ist, einen falschen Wert zu ersetzen, zB '' oder 0
%Vor%Wenn du wirklich nur für None
ersetzen kannst %Vor%Tags und Links python