veturi
Quiero usar %
formato de cadena de estilo para imprimir una tupla:
tup = (1,2,3)
print("this is a tuple: %s." % (tup))
Espero que se imprima como This is a tuple: (1,2,3).
pero en su lugar me sale un error que dice TypeError: not all arguments converted during string formatting
.
¿Qué está mal y cómo lo soluciono?
Al editar esta pregunta para mayor claridad y modernización, conservé un aspecto interesante del ejemplo original: los paréntesis alrededor tup
. Estos son no es necesario Para el %
sintaxis, y también no crees una tupla. Es posible que OP entendiera que el ajuste de tupla (descrito en las respuestas aquí) era necesario, pero simplemente se equivocó. Para obtener más información sobre ese problema, consulte Cómo crear una tupla “singleton” con un solo elemento.
alex martelli
>>> thetuple = (1, 2, 3)
>>> print("this is a tuple: %s" % (thetuple,))
this is a tuple: (1, 2, 3)
Hacer una tupla singleton con la tupla de interés como único elemento, es decir, el (thetuple,)
parte, es la parte clave aquí.
-
En Python 3, la impresión es una función, no una declaración, por lo que debe escribir
print(....)
.– Jürgen Gmach
16 mayo 2020 a las 17:09
Antimonio
El %
la sintaxis es obsoleta. Usar str.format
que es más simple y más legible:
t = 1,2,3
print('this is a tuple: {0}.'.format
-
Agregué un comentario a este stackoverflow.com/a/26249755/1676424 para el caso de 1 artículo tuple
– Jacob CUI
8 de octubre de 2014 a las 5:29
-
nunca supe porque
%
es obsoleto pero yo ahora siempre tustr.format
de todos modos, a ciegas. No importa eso, estoy interesado en cuál es el calificador completo, porque el simple{0}
no es el calificador completo, sino simplemente un indicador de posición. Por unint
lo que yo llamo el calificador completo sería{0:d}
(o{3:d}
por ejemplo, si el int que se va a imprimir se encuentra en la cuarta posición en elstr.format
método). Intenté imprimir una tupla usando el{0:s}
calificador pero no funciona. Entonces, ¿cuál es el calificador completo para algo como una tupla?– rayo
24 de marzo de 2016 a las 11:53
-
@Ray Eso realmente no tiene sentido. Hay muchas opciones que puede especificar, que se pueden encontrar en la documentación. Si quieres imprimir algo usando
str
puedes decir{!s}
, pero este es el valor predeterminado, por lo que no es necesario. Si quieres usarrepr
en cambio, puedes hacer{!r}
. A diferencia de con%
no hay necesidad de decird
para enteros.– Antimonio
24 de marzo de 2016 a las 14:02
-
Me gusta % de sintaxis ya que es menos detallada para mi mente que el nuevo formato, y también muy similar al formato de cadena c que conozco y amo
– Paulus
24 de abril de 2016 a las 0:48
-
Tenga en cuenta que, incluso en Python 3, el
%
no está completamente obsoleto. De hecho,pylint
incluso se quejará si usa el.format
sintaxis dentro de lalogging
módulo: stackoverflow.com/a/34634301/534238–Mike Williamson
20 jun 2018 a las 17:50
Fong Kah Chun
La forma correcta de hacerlo es:
>>> thetuple = (1, 2, 3)
>>> print("this is a tuple: %s" % (thetuple,))
this is a tuple: (1, 2, 3)
El %
El operador de cadena todavía es compatible con Python 3.x y facilita el formateo de una tupla (o lista) como valores separados. Usando .format
para este caso, se requerirá algo de trabajo adicional: los valores deben pasarse como argumentos separados o la secuencia deberá indexarse:
>>> tup = (1,2,3)
>>> print("First: %d, Second: %d, Third: %d" % tup)
First: 1, Second: 2, Third: 3
>>> print('First: {}, Second: {}, Third: {}'.format(1,2,3))
First: 1, Second: 2, Third: 3
>>> print('First: {0[0]}, Second: {0[1]}, Third: {0[2]}'.format(tup))
First: 1, Second: 2, Third: 3
El %
El operador también es útil para validar el tipo de los argumentos, utilizando diferentes códigos de formato (%s
, %d
, %i
), mientras que .formato() solo admite dos banderas de conversión: '!s'
y '!r'
.
-
Hice la transición a usar format() pero esta ventaja del método % (poder formatear cada elemento de una tupla y hacer conversiones) es grande, así que creo que regresaré. Gracias.
– Factura
15 de julio de 2017 a las 18:03
-
También puede especificar el formato para cada elemento. ‘{:d}{:s}’.formato(1, ‘2’)
– zk82
3 de enero de 2018 a las 15:58
-
La tupla “asterisco desempaquetado” funciona bien con
.format
:tup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup))
.– mdz
23 de agosto de 2018 a las 8:53
-
Esto está mal. El
.format
la sintaxis permite la verificación de tipos.!s
y!r
son una característica separada. Podemos especificar el tipo requerido con, por ejemplo'{:d}'.format(x)
que funcionará solo cuandox
es un número entero.– Karl Knechtel
4 abr a las 0:58
Vinay Sajip
>>> tup = (1, 2, 3)
>>> print "Here it is: %s" % (tup,)
Here it is: (1, 2, 3)
>>>
Aquí, (tup,)
– con la coma final – es una tupla que contiene una tupla. La tupla exterior es el argumento del operador %. La tupla interior es su contenido, que en realidad se imprime. Sin la coma final, (tup)
es lo mismo que tup
– los paréntesis son solo paréntesis de agrupación normales.
JE_Muc
Aunque esta pregunta es bastante antigua y tiene muchas respuestas diferentes, todavía me gustaría agregar la respuesta más “pitónica” y también legible/concisa.
Dado que Antimony ya muestra correctamente el método general de impresión de tuplas, esta es una adición para imprimir cada elemento en una tupla por separado, como Fong Kah Chun ha demostrado correctamente con el %s
sintaxis.
Curiosamente, solo se ha mencionado en un comentario, pero el uso de un operador de asterisco para desempaquetar la tupla produce una flexibilidad y legibilidad completas utilizando el str.format
método cuando imprimir elementos de tupla por separado.
tup = (1, 2, 3)
print('Element(s) of the tuple: One {0}, two {1}, three {2}'.format(*tup))
Esto también evita imprimir una coma al final cuando se imprime una tupla de un solo elemento, como lo evita Jacob CUI con replace
. (Aunque en mi humilde opinión, la representación de la coma final es correcta si desea conservar la representación del tipo al imprimir):
tup = (1, )
print('Element(s) of the tuple: One {0}'.format(*tup))
Carlos Knechtel
Además de los métodos propuestos en las otras respuestas, desde Python 3.6 también podemos usar Interpolación de cadenas literales (cuerdas f):
>>> tup = (1,2,3)
>>> print(f'this is a tuple: {tup}.')
this is a tuple: (1, 2, 3).
t = (1, 2, 3)
# the comma (,) concatenates the strings and adds a space
print "this is a tuple",
# format is the most flexible way to do string formatting
print "this is a tuple {0}".format
# classic string formatting
# I use it only when working with older Python versions
print "this is a tuple %s" % repr
print "this is a tuple %s" % str