Tupel mit String-Formatierung in Python drucken


126

Also, ich habe dieses Problem. Ich habe Tupel (1,2,3), das ich mit String-Formatierung drucken soll. z.B.

tup = (1,2,3)
print "this is a tuple %something" % (tup)

und dies sollte Tupeldarstellung mit Klammern wie drucken

Dies ist ein Tupel (1,2,3)

Aber ich bekomme TypeError: not all arguments converted during string formattingstattdessen.

Wie in aller Welt kann ich das tun? Ein bisschen verloren hier, wenn ihr mich in die richtige Richtung weisen könntet :)

Antworten:


200
>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)

Das Erstellen eines Singleton-Tupels mit dem interessierenden Tupel als einzigem Element, dh dem (thetuple,)Teil, ist hier das Schlüsselbit.


In Python 3 ist print eine Funktion, keine Anweisung, daher müssen Sie schreiben print(....).
JG

53

Beachten Sie, dass die %Syntax veraltet ist. Verwendung str.format, die einfacher und besser lesbar ist:

t = 1,2,3
print 'This is a tuple {0}'.format(t)

Ich habe diesem stackoverflow.com/a/26249755/1676424 einen Kommentar für den Fall eines 1-Artikel-Tupels hinzugefügt
Jacob CUI

Ich wusste nie warum %es veraltet ist, aber ich bin jetzt immer immer du str.format, blind. Trotzdem interessiert mich, was das vollständige Qualifikationsmerkmal ist, denn das Einfache {0}ist nicht das vollständige Qualifikationsmerkmal, sondern lediglich ein Positionsindikator. Zum Beispiel intwürde ich das vollständige Qualifikationsmerkmal nennen {0:d}(oder {3:d}zum Beispiel, wenn das zu druckende Int an der 4. Position in der str.formatMethode auftritt ). Ich habe versucht, ein Tupel mit dem {0:s}Qualifikationsmerkmal zu drucken, aber es funktioniert nicht. Also, was ist die vollständige Qualifikation für so etwas wie ein Tupel?
Ray

1
@ Ray Das macht eigentlich keinen Sinn. Sie können viele Optionen angeben, die Sie in der Dokumentation finden. Wenn Sie etwas mit drucken möchten, strkönnen Sie sagen {!s}, dies ist jedoch die Standardeinstellung, sodass dies nicht erforderlich ist. Wenn Sie reprstattdessen verwenden möchten , können Sie dies tun {!r}. Im Gegensatz zu mit %müssen keine dGanzzahlen angegeben werden.
Antimon

2
Ich mag% Syntax, da sie meiner Meinung nach weniger ausführlich ist als das neue Format und auch der Formatierung von C-Strings sehr ähnlich ist, die ich kenne und liebe
Paulus,

Beachten Sie, dass selbst unter Python 3 das %nicht vollständig veraltet ist. In der Tat pylintwird sich sogar beschweren, wenn Sie die .formatSyntax innerhalb des loggingModuls verwenden: stackoverflow.com/a/34634301/534238
Mike Williamson

39

Viele der oben gegebenen Antworten waren richtig. Der richtige Weg ist:

>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)

Es gab jedoch einen Streit darüber, ob der '%'String-Operator veraltet ist. Wie viele darauf hingewiesen haben, ist es definitiv nicht veraltet, da der '%'String-Operator einfacher ist, eine String-Anweisung mit Listendaten zu kombinieren.

Beispiel:

>>> tup = (1,2,3)
>>> print "First: %d, Second: %d, Third: %d" % tup
First: 1, Second: 2, Third: 3

Wenn Sie die .format()Funktion verwenden, erhalten Sie jedoch eine ausführliche Anweisung.

Beispiel:

>>> tup = (1,2,3)
>>> print "First: %d, Second: %d, Third: %d" % tup
>>> print 'First: {}, Second: {}, Third: {}'.format(1,2,3)
>>> print 'First: {0[0]}, Second: {0[1]}, Third: {0[2]}'.format(tup)

First: 1, Second: 2, Third: 3
First: 1, Second: 2, Third: 3
First: 1, Second: 2, Third: 3

Weiter mehr, '%'String - Operator auch nützlich für uns den Datentyp wie zu validieren %s, %d, %i, während .format () nur zwei Umwandlungs Flaggen unterstützen : '!s'und '!r'.


Ich habe den Übergang zur Verwendung von format () gemacht, aber dieser Vorteil der% -Methode (in der Lage zu sein, jedes Element eines Tupels zu formatieren und Konvertierungen durchzuführen) ist groß, daher denke ich, dass ich zurückkehren werde. Vielen Dank.
Bill

1
Sie können auch das Format für jedes Element angeben. '{: d} {: s}'. Format (1, '2')
zk82

5
Das Tupel "Sternchen entpackt" funktioniert gut mit .format: tup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup)).
m-dz

25
>>> tup = (1, 2, 3)
>>> print "Here it is: %s" % (tup,)
Here it is: (1, 2, 3)
>>>

Beachten Sie, dass dies (tup,)ein Tupel ist, das ein Tupel enthält. Das äußere Tupel ist das Argument für den Operator%. Das innere Tupel ist sein Inhalt, der tatsächlich gedruckt wird.

(tup)ist ein Ausdruck in Klammern, der bei Auswertung zu ergibt tup.

(tup,)mit dem nachfolgenden Komma steht ein Tupel, das tupals einziges Mitglied enthält.


9

Dies verwendet keine Zeichenfolgenformatierung, aber Sie sollten in der Lage sein:

print 'this is a tuple ', (1, 2, 3)

Wenn Sie die Zeichenfolgenformatierung wirklich verwenden möchten:

print 'this is a tuple %s' % str((1, 2, 3))
# or
print 'this is a tuple %s' % ((1, 2, 3),)

Dies setzt voraus, dass Sie eine Python-Version vor 3.0 verwenden.


7
t = (1, 2, 3)

# the comma (,) concatenates the strings and adds a space
print "this is a tuple", (t)

# format is the most flexible way to do string formatting
print "this is a tuple {0}".format(t)

# classic string formatting
# I use it only when working with older Python versions
print "this is a tuple %s" % repr(t)
print "this is a tuple %s" % str(t)

6

Obwohl diese Frage ziemlich alt ist und viele verschiedene Antworten hat, möchte ich dennoch die imho "pythonischste" und auch lesbarste / prägnanteste Antwort hinzufügen.

Da die allgemeine tupleDruckmethode von Antimony bereits korrekt angezeigt wird, ist dies eine Ergänzung zum Drucken jedes Elements in einem Tupel separat, wie Fong Kah Chun mit der %sSyntax korrekt angezeigt hat .

Interessanterweise wurde es nur in einem Kommentar erwähnt, aber die Verwendung eines Sternchenoperators zum Entpacken des Tupels bietet volle Flexibilität und Lesbarkeit unter Verwendung der str.formatMethode, wenn Tupelelemente separat gedruckt werden .

tup = (1, 2, 3)
print('Element(s) of the tuple: One {0}, two {1}, three {2}'.format(*tup))

Dies vermeidet auch das Drucken eines nachgestellten Kommas beim Drucken eines Einzelelement-Tupels, wie von Jacob CUI mit umgangen replace. (Auch wenn imho die nachgestellte Kommadarstellung korrekt ist, wenn die Typendarstellung beim Drucken beibehalten werden soll ):

tup = (1, )
print('Element(s) of the tuple: One {0}'.format(*tup))

5

Ich denke, der beste Weg, dies zu tun, ist:

t = (1,2,3)

print "This is a tuple: %s" % str(t)

Wenn Sie mit der Formatierung im Printf- Stil vertraut sind , unterstützt Python eine eigene Version. In Python erfolgt dies mit dem Operator "%", der auf Zeichenfolgen angewendet wird (eine Überladung des Modulo-Operators), der eine beliebige Zeichenfolge verwendet und eine Formatierung im printf-Stil darauf anwendet.

In unserem Fall weisen wir es an, "Dies ist ein Tupel:" zu drucken und dann eine Zeichenfolge "% s" hinzuzufügen. Für die eigentliche Zeichenfolge übergeben wir eine Zeichenfolgendarstellung des Tupels (indem wir str ( t)).

Wenn Sie mit der Formatierung im Printf-Stil nicht vertraut sind, empfehle ich dringend, etwas zu lernen, da dies sehr normal ist. Die meisten Sprachen unterstützen es auf die eine oder andere Weise.


2

Bitte beachten Sie, dass ein nachfolgendes Komma hinzugefügt wird, wenn das Tupel nur einen Eintrag enthält. z.B:

t = (1,)
print 'this is a tuple {}'.format(t)

und du wirst bekommen:

'this is a tuple (1,)'

In einigen Fällen möchten Sie beispielsweise eine Liste in Anführungszeichen erhalten, die in MySQL-Abfragezeichenfolgen wie verwendet werden soll

SELECT name FROM students WHERE name IN ('Tom', 'Jerry');

Sie müssen in Betracht ziehen, das Tailing-Komma zu entfernen. Verwenden Sie replace (',)', ')') nach der Formatierung, da das Tupel möglicherweise nur 1 Element wie ('Tom',) enthält. Daher muss das Tailing-Komma entfernt werden:

query_string = 'SELECT name FROM students WHERE name IN {}'.format(t).replace(',)', ')')

Bitte schlagen Sie vor, ob Sie eine angemessene Möglichkeit haben, dieses Komma in der Ausgabe zu entfernen.


1
Normalerweise bevorzuge ich so etwas wie 'Dies ist ein Tupel ({})'. Format (',' .join (map (str, t))). Auf diese Weise müssen Sie sich nicht um vorhandene Kommas oder Klammern in der Formatzeichenfolge kümmern.
Antimon

1
Sie sollten nicht format()in Datenbankabfragen verwenden. Hierfür gibt es in jeder Bibliothek anwendbare Methoden.
Ktalik

@ktalik du verstehst das offensichtlich nicht. format () hat nichts mit Datenbankabfragen zu tun. format () ist eine allgemeine Funktion für Python-String-Operationen. Werfen Sie einen Blick auf docs.python.org/2/library/string.html und Sie werden daraus lernen. Nichts mit Datenbankabfragen zu tun.
Jacob CUI

Die Verwendung format()mit von Benutzern gesammelten Werten kann zu einer SQL-Injection führen. Es ist sicherer, Eingabewerte zu überprüfen, bevor sie in die Abfrage eingefügt werden. Weitere Informationen finden Sie in diesen Richtlinien: dev.mysql.com/doc/connector-python/en/… Sie können Parameterwerte auch in eine Zeichenfolgendarstellung vom Datenbanktyp umwandeln und dann in die Abfragezeichenfolge einfügen. Werfen Sie einen Blick auf initd.org/psycopg/docs/usage.html , wo man ein Gegenbeispiel mit hat %Betreiber und eine Lösung mit execute()Verfahren , bei dem Abfrageparameter in der Methode args übergeben werden.
Ktalik

1
@Paul Rooney Bitte beachten Sie, dass ich zu erklären versuche, ein nachfolgendes Komma wird hinzugefügt, wenn das Tupel nur ein Element enthält. UND es wird Probleme verursachen, wenn es nicht richtig verwendet wird. Auch das Format kann sicherlich zum Bilden von SQL-Abfragen verwendet werden. Woher kommen die Kritiker?
Jacob CUI

2

Neben den in den anderen Antworten vorgeschlagenen Methoden können Sie seit Python 3.6 auch die Literal String Interpolation (f-Strings) verwenden:

>>> tup = (1,2,3)
>>> print(f'this is a tuple {tup}')
this is a tuple (1, 2, 3)

0

Versuchen Sie dies, um eine Antwort zu erhalten:

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

Wenn wir nur ein Tupel in () einfügen, wird selbst ein Tupel erstellt:

>>> (d)
('1', '2')

Dies bedeutet, dass die obige print-Anweisung wie folgt aussieht: print ("Wert:% s"% ('1', '2')), was ein Fehler ist!

Daher:

>>> (d,)
(('1', '2'),)
>>> 

Oben werden die Argumente des Drucks korrekt eingegeben.


0

Für Python 3

tup = (1,2,3)
print("this is a tuple %s" % str(tup))

0

Sie können dies auch versuchen;

tup = (1,2,3)
print("this is a tuple {something}".format(something=tup))

Sie können nicht %somethingmit (tup)nur wegen des Packens und Auspackens Konzept mit Tupel verwenden.


-5

Sprechen ist billig, zeigen Sie den Code:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.