2009-09-21 13 views
83

Quindi, ho questo problema. Ho la tupla (1,2,3) che dovrei stampare con la formattazione delle stringhe. es.Stampa tupla con formattazione di stringhe in Python

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

e questo dovrebbe stampare rappresentazione tupla con le staffe, come

Questa è una tupla (1,2,3)

ma ottengo TypeError: not all arguments converted during string formatting invece.

In che modo sono in grado di farlo? Kinda perso qui così se voi ragazzi mi potrebbe indicare una direzione giusta :)

risposta

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

Fare una tupla singleton con la tupla di interesse come unico elemento, cioè la parte (thetuple,), è il bit chiave qui.

8

Questo non fa uso di formattazione delle stringhe, ma si dovrebbe essere in grado di fare:

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

Se davvero si vuole utilizzare stringa formattazione:

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

Nota, si presume che si stia utilizzando una versione di Python precedente alla 3.0.

+1

Penso che questo sia più elegante (e leggibile) che una tupla avvolgente. –

+0

Sono sorpreso che questa risposta non abbia ottenuto più attenzione – Chris

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

Si noti che (tup,) è una tupla contenente una tupla. La tupla esterna è l'argomento dell'operatore%. La tupla interna è il suo contenuto, che è effettivamente stampato.

(tup) è un'espressione tra parentesi, che al momento della valutazione risulta in tup.

(tup,) con la virgola finale è una tupla, che contiene tup come membro.

4
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) 
1

Penso che il modo migliore per farlo è:

t = (1,2,3) 

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

Se si ha familiarità con printf formattazione dello stile, quindi Python supporta la propria versione. In Python, questo viene fatto usando l'operatore "%" applicato alle stringhe (un sovraccarico dell'operatore del modulo), che prende qualsiasi stringa e applica la formattazione in stile printf ad esso.

Nel nostro caso, stiamo dicendo di stampare "Questa è una tupla:", e quindi aggiungendo una stringa "% s", e per la stringa attuale, stiamo passando in una rappresentazione di stringa della tupla (chiamando str (t)).

Se non si ha familiarità con la formattazione dello stile di stampa, consiglio vivamente l'apprendimento, poiché è molto standard. La maggior parte delle lingue lo supporta in un modo o nell'altro.

34

Si noti che la sintassi % è obsoleta.Utilizzare str.format, che è più semplice e più leggibile:

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

Ho aggiunto un commento a questo http://stackoverflow.com/a/26249755/1676424 per il caso di 1 articolo tupla –

+0

Non ho mai saputo perché '%' è obsoleto ma io ora ti capisco sempre "str.format", ciecamente. Non importa, sono interessato a quello che è il qualificatore completo, perché il semplice '{0}' non è il pieno qualificatore, ma semplicemente un indicatore di posizione. Per un 'int', quello che chiamo il qualificatore completo sarebbe' {0: d} '(o' {3: d} 'per esempio, se l'int da stampare si verifica nella 4a posizione nel' str.format 'metodo). Ho provato a stampare una tupla usando il qualificatore '{0: s}' ma non funziona. Quindi qual è la qualifica completa per qualcosa come una tupla? – Ray

+1

@Ray Questo non ha molto senso. Ci sono molte opzioni che puoi specificare, che puoi trovare nella documentazione. Se vuoi stampare qualcosa usando 'str' puoi dire' {! S} ', ma questo è il default, quindi non è necessario. Se invece vuoi usare 'repr', puoi fare' {! R} '. A differenza di '%', non c'è bisogno di dire 'd' per i numeri interi. – Antimony

0

Si prega di notare sarà aggiunto un virgola finale se la tupla ha un solo elemento. per esempio:

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

e si otterrà:

'this is a tuple (1,)' 

in alcuni casi ad esempio si desidera ottenere un elenco citato da utilizzare nella stringa di query mysql come

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

è necessario considerare per rimuovere il tailing Comma utilizzare sostituire (')', ')') dopo la formattazione, perché è possibile che la tupla ha solo 1 articolo simile ('Tom',), in modo che il tailing virgola deve essere rimosso:

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

si prega di suggerire se avete modo decente di rimozione di questa virgola nel uscita.

+0

Di solito preferisco qualcosa come 'questa è una tupla ({})' .format (',' .join (map (str, t))). In questo modo non devi preoccuparti di fare confusione con le virgole o le parentesi esistenti nella stringa di formato. – Antimony

+0

Non si dovrebbe usare 'format()' nelle query del database. Esistono metodi applicabili per questo in ogni libreria. – ktalik

+0

@ktalik non lo capisci ovviamente. format() non ha nulla a che fare con le query del database. format() è una funzione comune all'operazione di stringa python. Dai un'occhiata a https://docs.python.org/2/library/string.html e imparerai da esso. Non ricorda nulla delle query del database. –

15

Molte risposte fornite sopra erano corrette. Il modo giusto per farlo è:

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

Tuttavia, c'è stata una disputa se l'operatore '%' String è obsoleto. Come molti hanno sottolineato, non è sicuramente obsoleto, in quanto l'operatore di stringa '%' è più facile da combinare un'istruzione String con un elenco di dati.

Esempio:

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

Tuttavia, usando la funzione .format(), si finirà con una dichiarazione prolisso.

Esempio:

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

ulteriormente più, '%' stringa operatore inoltre utile di validare il tipo di dati quali %s, %d, %i, mentre .format() only support two conversion flags: '!s' e '!r'.

+0

Ho fatto la transizione all'utilizzo di format() ma questo vantaggio del metodo% (essendo in grado di formattare ogni elemento di una tupla e fare conversioni) è grande quindi penso che tornerò indietro. Grazie. – Bill

+0

È anche possibile specificare il formato per ciascun elemento. '{: d} {: s}'. format (1, '2') – zk82

-4

Parlare è facile, vi mostrerà il codice:

>>> tup = (10, 20, 30) 
>>> i = 50 
>>> print '%d  %s'%(i,tup) 
50 (10, 20, 30) 
>>> print '%s'%(tup,) 
(10, 20, 30) 
>>> 
Problemi correlati