Ich versuche, "gerade" oder nicht mit Listenverständnis zu drucken, erhalte jedoch eine Fehlermeldung.

myNames = ['A','BB','CCC','DDDD']
myList3 = [ 'even' if x%2==0 else 'nope' for x in myNames]

Error: TypeError: not all arguments converted during string formatting

Was ist der Grund dafür?

0
blockByblock 19 Apr. 2018 im 00:07

3 Antworten

Beste Antwort

Sie verwenden den Operator % für eine Zeichenfolge:

>>> x = 'A'
>>> x % 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

Wenn Sie % für eine Zeichenfolge verwenden, erhalten Sie nicht den Modul, sondern printf - Formatieren der Zeichenfolgenformatierung . Dazu ist ein Platzhalter im % - Stil erforderlich, damit der Wert auf der rechten Seite formatiert werden kann. Ohne Platzhalter in der Zeichenfolge links wird der angezeigte Fehler angezeigt.

Wenn Sie testen möchten, ob die Länge der Zeichenfolge gerade ist, müssen Sie die Funktion len() verwenden, um diese Länge zu erhalten:

myList3 = ['even' if len(x) % 2 == 0 else 'nope' for x in myNames]

Demo:

>>> myNames = ['A','BB','CCC','DDDD']
>>> ['even' if len(x) % 2 == 0 else 'nope' for x in myNames]
['nope', 'even', 'nope', 'even']
5
Martijn Pieters 18 Apr. 2018 im 21:12

Die anderen Antworten erklären, warum Ihre Syntax falsch ist.

Wenn Sie interessiert sind, finden Sie hier eine alternative Implementierung mit einem Wörterbuch.

Das Eliminieren von if / else -Konstrukten zugunsten eines Wörterbuchs ist häufig sowohl effizient als auch lesbar.

myNames = ['A','BB','CCC','DDDD']

mapper = {0: 'even', 1: 'nope'}
res = [mapper[len(i) %2] for i in myNames]

# ['nope', 'even', 'nope', 'even']
2
jpp 18 Apr. 2018 im 21:20

Der Operator % dient bei Verwendung mit einer Zeichenfolge als linkes Argument für die Formatierung im printf-Stil. Wenn Sie die Länge Ihrer Zeichenfolgen testen möchten, müssen Sie mit len von der Zeichenfolge in die Länge konvertieren, z.

myList3 = [ 'even' if len(x) % 2==0 else 'nope' for x in myNames]
0
ShadowRanger 18 Apr. 2018 im 21:09