Inserimento più volte dello stesso valore durante la formattazione di una stringa


111

Ho una stringa di questo modulo

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

Tutti i% s nella stringa hanno lo stesso valore (cioè s). C'è un modo migliore per scrivere questo? (Invece di elencare le s tre volte)



2
Questo %operatore di stringa sarà "deprecato su Python 3.1 e rimosso in seguito" docs.python.org/release/3.0.1/whatsnew/… ora mi chiedo quale sia il modo più consigliato sia per la compatibilità delle versioni che per la sicurezza.
cregox

2
@Cawas, so che è piuttosto tardi, ma mi piace usare str.format(). Es .: query = "SELECT * FROM {named_arg}"; query.format(**kwargs), dove queryè la stringa di formato ed kwargsè un dizionario con chiavi che corrispondono alla named_args nella stringa di formato.
Edwin

4
@Cawas Si ', tranne Adam utilizzata la notazione tupla, dove {0}, {1}, {2}e così via corrispondono a indici tuple 0, 1, e 2, rispettivamente. In alternativa, è anche possibile nominare gli argomenti (like {named_arg}) e impostarli nel metodo di formattazione, in questo modo:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin

2
@bignose Hai contrassegnato entrambe le domande come duplicati l'una dell'altra come google.com/…
abhi

Risposte:



40
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

Potresti voler leggere questo per avere una comprensione: Operazioni di formattazione delle stringhe .


1
Bello. Si era dimenticato di questo. anche locals () farà altrettanto.
Goutham

2
@Goutham: la risposta di Adam Rosenfield potrebbe essere migliore se la tua versione di Python è aggiornata.
mhawke

In realtà lo è. Mi sto ancora abituando alle nuove operazioni di formattazione delle stringhe.
Goutham

3
ancora meglio, puoi moltiplicare la stringa di base: '% (s) s hello world' * 3% {'s': 'asdad'}
dalloliogm

15

Puoi utilizzare il tipo di formattazione del dizionario:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}

1
Sembra essere molto poco utile nel fornire questa risposta duplicata. Eccone un altro: '% (string_goes_here) s hello world% (string_goes_here) s hello world% (string_goes_here) s'% {'string_goes_here': s,}. C'è praticamente un numero infinito di possibilità.
mhawke

3
mhawke: ho postato il messaggio prima che il mio browser ricarichi la pagina, quindi non sapevo in quel momento che la domanda avesse già una risposta. Non devi essere un uomo scortese !!.
Lucas S.

2
@ Lucas: suppongo che sia possibile che ti siano serviti 13 minuti per digitare la tua risposta :) e grazie per il voto negativo ... molto apprezzato.
mhawke

13

Dipende da cosa intendi per meglio. Funziona se il tuo obiettivo è la rimozione della ridondanza.

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))

3
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit

Immagino che l'esempio nella domanda non riguardasse "ciao mondo" ripetuto, ma un modello reale senza duplicazioni. Ecco perché ho svalutato.
Gra

1

Fstrings

Se stai usando Python 3.6+puoi usare il nuovo cosiddetto f-stringsche sta per stringhe formattate e può essere usato aggiungendo il carattere fall'inizio di una stringa per identificarla come una stringa 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!

I principali vantaggi dell'utilizzo di stringhe f è che sono più leggibili, possono essere più veloci e offrono prestazioni migliori:

Panda di origine per tutti: analisi dei dati Python, di Daniel Y. Chen

Punti di riferimenti

Non c'è dubbio che i nuovi f-stringssiano più leggibili, in quanto non è necessario rimappare le corde, ma è più veloce anche se come affermato nella citazione sopra?

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

Eseguendo 10 milioni di test sembra che i nuovi f-stringssiano effettivamente più veloci nella mappatura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.