Imprimindo tupla com formatação de string em Python


127

Então, eu tenho esse problema. Eu tenho tupla (1,2,3) que eu deveria imprimir com formatação de string. por exemplo.

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

e isso deve imprimir a representação da tupla com colchetes, como

Esta é uma tupla (1,2,3)

Mas eu entendo TypeError: not all arguments converted during string formatting .

Como no mundo eu sou capaz de fazer isso? Meio que perdi aqui, então se vocês pudessem me indicar uma direção certa :)

Respostas:


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

Fazer uma tupla singleton com a tupla de interesse como o único item, ou seja, a (thetuple,)peça, é o ponto principal aqui.


No Python 3, imprimir é uma função, não uma instrução, então você deve escrever print(....).
JG

53

Observe que a %sintaxe é obsoleta. Use str.format, que é mais simples e mais legível:

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

Eu adicionei um comentário a este stackoverflow.com/a/26249755/1676424 para o caso de tupla 1 artigo
Jacob CUI

Eu nunca soube por que %é obsoleto, mas agora sempre você str.formatmesmo, cegamente. Não importa, estou interessado no que é o qualificador completo, porque o simples {0}não é o qualificador completo, mas apenas um indicador de posição. Para um int, o que eu chamo de qualificador completo seria {0:d}(ou, {3:d}por exemplo, se o int a ser impresso ocorrer na 4ª posição do str.formatmétodo). Tentei imprimir uma tupla usando o {0:s}qualificador, mas ele não funciona. Então, qual é o qualificador completo para algo como uma tupla?
Raio

1
@ Ray Isso realmente não faz sentido. Você pode especificar várias opções, que podem ser encontradas na documentação. Se você quiser imprimir algo usando, strpode dizer {!s}, mas esse é o padrão, portanto, é desnecessário. Se você quiser usar repr, você pode fazer {!r}. Ao contrário de %, não há necessidade de dizer dpara números inteiros.
Antimony

2
Eu meio que gosto de sintaxe%, uma vez que é menos detalhada à minha mente do que o novo formato, e também muito semelhante ao c seqüência de formatação whick eu conheço e amo
Paulus

Observe que, mesmo no Python 3, o %arquivo não é totalmente obsoleto. De fato, pylintaté reclamará se você usar a .formatsintaxe dentro do loggingmódulo: stackoverflow.com/a/34634301/534238
Mike Williamson

39

Muitas respostas dadas acima estavam corretas. A maneira correta de fazer isso é:

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

No entanto, houve uma disputa sobre se o '%'operador String está obsoleto. Como muitos apontaram, definitivamente não é obsoleto, pois o '%'operador String é mais fácil de combinar uma instrução String com os dados da lista.

Exemplo:

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

No entanto, usando a .format()função, você terminará com uma declaração detalhada.

Exemplo:

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

Ainda mais, '%'operador de corda também útil para nós para validar o tipo de dados, como %s, %d, %i, enquanto .format () suportam apenas dois sinalizadores de conversão : '!s'e '!r'.


Fiz a transição para o formato (), mas essa vantagem do método% (poder formatar cada elemento de uma tupla e fazer conversões) é grande, então acho que voltarei. Obrigado.
Bill

1
Você também pode especificar o formato para cada elemento. '{: d} {: s}'. format (1, '2')
zk82

5
O "asterisco descompactado" tupla funciona bem com .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)
>>>

Observe que (tup,)é uma tupla que contém uma tupla. A tupla externa é o argumento para o operador%. A tupla interna é o seu conteúdo, que é realmente impresso.

(tup)é uma expressão entre colchetes que, quando avaliada, resulta em tup.

(tup,)com a vírgula à direita é uma tupla, que contém tupcomo único membro.


9

Isso não usa formatação de string, mas você deve ser capaz de:

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

Se você realmente deseja usar a formatação de string:

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

Observe que isso pressupõe que você esteja usando uma versão Python anterior à 3.0.


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

Mesmo que essa pergunta seja bastante antiga e tenha muitas respostas diferentes, eu ainda gostaria de adicionar a resposta imho mais "pitônica" e também legível / concisa.

Como o tuplemétodo de impressão geral já é mostrado corretamente pelo Antimony, isso é um complemento para imprimir cada elemento em uma tupla separadamente, como Fong Kah Chun mostrou corretamente com a %ssintaxe.

Curiosamente, isso foi mencionado apenas em um comentário, mas o uso de um operador de asterisco para descompactar a tupla gera flexibilidade e legibilidade total usando o str.formatmétodo ao imprimir elementos de tupla separadamente .

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

Isso também evita a impressão de uma vírgula à direita ao imprimir uma tupla de elemento único, conforme contornado por Jacob CUI replace. (Mesmo que imho, a representação de vírgula à direita esteja correta se desejar preservar a representação de tipo ao imprimir ):

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

5

Eu acho que a melhor maneira de fazer isso é:

t = (1,2,3)

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

Se você está familiarizado com a formatação no estilo printf , o Python suporta sua própria versão. No Python, isso é feito usando o operador "%" aplicado às strings (uma sobrecarga do operador do módulo), que pega qualquer string e aplica a formatação no estilo printf.

No nosso caso, dizemos para imprimir "Esta é uma tupla:" e, em seguida, adicionamos uma string "% s" e, para a string real, estamos passando uma representação de string da tupla (chamando str ( t)).

Se você não está familiarizado com a formatação no estilo printf, sugiro o aprendizado, pois é muito padrão. A maioria dos idiomas suporta de uma maneira ou de outra.


2

Observe que uma vírgula à direita será adicionada se a tupla tiver apenas um item. por exemplo:

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

e você terá:

'this is a tuple (1,)'

em alguns casos, por exemplo, você deseja que uma lista entre aspas seja usada na string de consulta do mysql como

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

é necessário considerar remover a vírgula de rejeição, use replace (',)', ')') após a formatação, pois é possível que a tupla tenha apenas 1 item como ('Tom'), para que a vírgula de rejeição precise ser removida:

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

Por favor, sugira se você tem uma maneira decente de remover esta vírgula na saída.


1
Normalmente, prefiro algo como 'this is a tupla ({})'. Format (',' .join (map (str, t))). Dessa forma, você não precisa se preocupar em mexer com vírgulas ou parênteses existentes na string de formato.
Antimônio 9/10

1
Você não deve usar format()em consultas de banco de dados. Existem métodos aplicáveis ​​para isso em todas as bibliotecas.
22816 ktalik

@ktalik você não entende isso, obviamente. format () não tem nada a ver com consultas ao banco de dados. format () é uma função comum à operação de strings python. Veja docs.python.org/2/library/string.html e você aprenderá com isso. Lembre-se de nada sobre as consultas ao banco de dados.
27416 Jacob CUI

O uso de format()valores coletados dos usuários pode resultar em injeção de SQL. É mais seguro validar valores de entrada antes de colocá-los na consulta. Consulte estas diretrizes para obter mais informações: dev.mysql.com/doc/connector-python/en/… Você também pode converter valores de parâmetros em uma representação de string do tipo banco de dados e colá-lo na string de consulta. Dê uma olhada em initd.org/psycopg/docs/usage.html, onde você tem um contraexemplo com %operador e uma solução com execute()método em que parâmetros de consulta estão sendo passados ​​nos métodos args.
22816 ktalik

1
@ Paul Rooney Por favor, note que estou tentando explicar, uma vírgula à direita será adicionada se a tupla tiver apenas um item. E causará problemas se não for usado corretamente. Também o formato certamente pode ser usado para formar consultas SQL. De onde vêm os detratores ??
26417 Jacob CUI

2

Além dos métodos propostos nas outras respostas, desde o Python 3.6 você também pode usar a Literal String Interpolation (f-strings):

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

0

Tente isto para obter uma resposta:

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

Se colocarmos apenas uma tupla dentro de (), ela produzirá uma tupla:

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

Isso significa que a declaração de impressão acima será parecida com: print ("Value:% s"% ('1', '2')), o que é um erro!

Conseqüentemente:

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

Acima será alimentado corretamente aos argumentos da impressão.


0

Para python 3

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

0

Você pode tentar este também;

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

Você não pode usar %somethingcom (tup)apenas por causa de embalagem e descompactar conceito com tupla.


-5

O papo é barato, mostre o código:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.