Die meisten pythonischen Wege, um eine möglicherweise unvollständige Liste zu erweitern

8

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.

    
gravitation 05.02.2009, 14:11
quelle

20 Antworten

10

Im Gegensatz zu zip verlängert Pythons map automatisch kürzere Sequenzen mit None .

%Vor%

Sie könnten das Lambda auf

vereinfachen %Vor%

wenn es in Ordnung ist, andere falsch-ähnliche Objekte in choicesTxt genauso zu behandeln wie None .

    
ephemient 05.02.2009, 15:54
quelle
7

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

    
James Brady 05.02.2009 14:31
quelle
3

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.

    
Douglas Leeder 05.02.2009 14:17
quelle
3

Sie könnten map (dictionary) anstelle von list verwenden:

%Vor%

Dann haben Sie Karte mit Ihren Daten gefüllt.
Wenn Sie stattdessen eine Liste möchten, können Sie Folgendes tun:

%Vor%     
Abgan 05.02.2009 14:36
quelle
2

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.

    
Brian 05.02.2009 14:22
quelle
2

Einfachste und pythisch für mich ist:

%Vor%     
DzinX 05.02.2009 16:30
quelle
1

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%     
DNS 05.02.2009 14:40
quelle
1

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 ())

    
Johannes Weiß 05.02.2009 14:28
quelle
1

Ich würde

machen %Vor%

ersetzt nur die tatsächlichen None -Werte (nicht alles, was als falsch bewertet wird) und erweitert die Liste in einem separaten Schritt, der meiner Meinung nach klarer ist.

    
dF. 05.02.2009 15:01
quelle
1

Ich finde, dass wenn List-Comprehensions lang werden, es besser ist, einen Standard for-Loop zu verwenden. Fast so wie andere, aber trotzdem:

%Vor%     
monkut 05.02.2009 15:07
quelle
1
%Vor%     
Ignacio Vazquez-Abrams 05.02.2009 15:10
quelle
1

Sie könnten einfacher mit einem Listenverständnis gehen:

%Vor%

Damit wird None an Ihre Auswahlliste angehängt, bis mindestens 10 Elemente vorhanden sind, das Ergebnis aufgelistet wird und "Auswahl X" eingefügt wird, wenn das X-te Element fehlt.

    
ojrac 05.02.2009 15:25
quelle
1

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.

%Vor%     
joeforker 05.02.2009 14:29
quelle
1
%Vor%     
Roger Pate 05.02.2009 16:05
quelle
1

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%

    
John Montgomery 05.02.2009 16:30
quelle
0

Ich würde auch empfehlen, xrange statt range zu verwenden. Die XRange-Funktion generiert die Zahlen nach Bedarf. Bereich erzeugt sie im Voraus. Für kleine Sets macht das keinen großen Unterschied, aber für große Bereiche können die Einsparungen enorm sein.

    
Arcane 05.02.2009 14:22
quelle
0
%Vor%     
SilentGhost 05.02.2009 14:36
quelle
0

Meine zwei Cent ...

%Vor%     
Lord British 10.09.2010 11:28
quelle
0

Wenn es in Ordnung ist, einen falschen Wert zu ersetzen, zB '' oder 0

%Vor%

Wenn du wirklich nur für None

ersetzen kannst %Vor%     
John La Rooy 15.04.2011 05:05
quelle
0
%Vor%     
quelle

Tags und Links