Inserir o mesmo valor várias vezes ao formatar uma string

111

Eu tenho uma string deste formulário

s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)

Todos os% s na string têm o mesmo valor (ou seja, s). Existe uma maneira melhor de escrever isso? (Em vez de listar três vezes)

Goutham
fonte
2
Este %operador de string será "obsoleto no Python 3.1 e removido posteriormente em algum momento" docs.python.org/release/3.0.1/whatsnew/… agora eu me pergunto qual é a maneira mais recomendada para compatibilidade de versão e segurança.
cregox
2
@Cawas sei que é bem tarde, mas gosto de usar str.format(). Ex .: query = "SELECT * FROM {named_arg}"; query.format(**kwargs), onde queryé a string de formato e kwargsé um dicionário com chaves que correspondem aos named_args na string de formato.
Edwin
4
@Cawas Sim, excepto Adam utilizado notação tuplo, onde {0}, {1}, {2}e assim por diante correspondem aos índices de tupla 0, 1, e 2, respectivamente. Como alternativa, também é possível nomear os args (como {named_arg}) e definir cada um no método de formato, da seguinte forma:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin
2
@bignose Você marcou as duas perguntas como duplicatas uma da outra, como google.com/…
abhi

Respostas:

203

Você pode usar a formatação de string avançada , disponível em Python 2.6 e Python 3.x:

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)
Adam Rosenfield
fonte
11
~ minha preferência pessoal, escolha o estilo kwargsresult = '{st} hello world {st} hello world {st}'.format(st=incoming)
nehem,
40
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

Você pode gostar de ler isto para entender: Operações de formatação de strings .

mhawke
fonte
1
Agradável. Tinha esquecido disso. os locais () também farão.
Goutham
2
@Goutham: A resposta de Adam Rosenfield pode ser melhor se sua versão do Python estiver atualizada.
mhawke
É verdade. Ainda estou me acostumando com as novas operações de formatação de strings.
Goutham
3
melhor ainda, você pode multiplicar a string de base: '% (s) s hello world' * 3% {'s': 'asdad'}
dalloliogm
15

Você pode usar o tipo de formatação de dicionário:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}
Lucas S.
fonte
1
Parece não haver muito sentido em fornecer esta resposta duplicada. Aqui está outro: '% (string_goes_here) s hello world% (string_goes_here) s hello world% (string_goes_here) s'% {'string_goes_here': s,}. Existe praticamente um número infinito de possibilidades.
mhawke
3
mhawke: postei a mensagem antes de meu navegador recarregar a página, então não sabia naquele momento que a pergunta já havia sido respondida. Você não precisa ser rude cara !!.
Lucas S.
2
@Lucas: Suponho que você tenha demorado 13 minutos para digitar sua resposta :) e obrigado pelo voto negativo ... muito apreciado.
mhawke
13

Depende do que você entende por melhor. Isso funciona se seu objetivo for a remoção da redundância.

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))
jjames
fonte
3
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit
Whiterocker
fonte
Eu acho que o exemplo na pergunta não era sobre 'hello world' repetido, mas um modelo real sem duplicação. É por isso que votei negativamente.
Gra de
1

Fstrings

Se você estiver usando, Python 3.6+pode fazer uso do novo denominado f-stringsque significa strings formatadas e pode ser usado adicionando o caractere fno início de uma string para identificá-la como uma string f .

price = 123
name = "Jerry"
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!")
>Jerry!!, 123 is much, isn't 123 a lot? Jerry!

Os principais benefícios de usar strings f são que eles são mais legíveis, podem ser mais rápidos e oferecem melhor desempenho:

Fonte Pandas para todos: Python Data Analysis, por Daniel Y. Chen

Benchmarks

Sem dúvida que os novos f-stringssão mais legíveis, já que não é necessário remapear as strings, mas é mais rápido, conforme afirmado na citação acima?

price = 123
name = "Jerry"

def new():
    x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!"


def old():
    x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name)

import timeit
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7))
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7))
> 3.8741058271543776  #new
> 5.861819514350163   #old

Executando 10 milhões de testes, parece que os novos f-stringssão realmente mais rápidos no mapeamento.

user1767754
fonte