2009-08-04 12 views
85

mam ciąg tej postaciumieszczenie takich samych wartości wielokrotnie podczas formatowania ciąg

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

Wszystkie% s łańcucha mają taką samą wartość, to znaczy (a). Czy jest lepszy sposób na zapisanie tego? (Zamiast wymieniając się s trzykrotnie)

+0

Duplikat: http://stackoverflow.com/questions/543399/python-string-formatowanie – bignose

+2

Ten operator '%' będzie "wycofany w Pythonie 3.1 i później usunięty w pewnym momencie" http: //docs.python .org/release/3.0.1/whatsnew/3.0.html # pep-3101-a-nowe-podejście-do-formatowania tekstu teraz zastanawiam się, jaki jest najbardziej zalecany sposób zarówno kompatybilności wersji, jak i bezpieczeństwa. – cregox

+2

@Cawas Wiem, że jest dość późno, ale lubię używać 'str.format()'. Przykład: 'query =" SELECT * FROM {named_arg} "; query.format (** kwargs) ', gdzie' query' to ciąg formatu, a 'kwargs' to słownik z kluczami pasującymi do' named_arg's w ciągu formatującym. – Edwin

Odpowiedz

154

advanced string formatting można użyć dostępnego w Pythonie 2.6 i Python 3.x:

incoming = 'arbit' 
result = '{0} hello world {0} hello world {0}'.format(incoming) 
+5

~ moje osobiste preferencje, idź do stylu kwargs 'result = '{st} hello world {st} hello world {st} '. format (st = incoming) ' – nehemiah

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

może chcesz mieć odczytu tego aby uzyskać zrozumienie: String Formatting Operations.

+1

Nice. Zapomniałem o tym. locals() również to zrobi. – Goutham

+1

@ Goutham: odpowiedź Adama Rosenfielda może być lepsza, jeśli wersja Pythona jest aktualna. – mhawke

+0

To jest rzeczywiście. Nadal jestem przyzwyczajony do nowych operacji formatowania napisów. – Goutham

13

Można użyć typu Słownik formatowania:

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

Wydaje się, że nie ma sensu udzielać tej duplikowanej odpowiedzi. Oto kolejna: "% (string_goes_here) s hello world% (string_goes_here) s hello world% (string_goes_here) s '% {' string_goes_here ': s,}. Praktycznie istnieje nieskończona liczba możliwości. – mhawke

+3

mhawke: opublikowałem wiadomość, zanim moja przeglądarka załaduje stronę, więc nie wiedziałem na ten temat, że pytanie już zostało odebrane. Nie musisz być niegrzecznym człowiekiem !! –

+2

@Lucas: Przypuszczam, że możliwe, że zajęło ci 13 minut wpisanie swojej odpowiedzi :) i dziękuję za głosowanie w dół ... bardzo doceniane. – mhawke

11

zależy co masz na myśli lepiej. Działa to, jeśli twoim celem jest usunięcie nadmiarowości.

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

Myślę, że przykład w pytaniu nie dotyczył powtórzenia "cześć świata", ale prawdziwy szablon bez powielania. Dlatego zaaprobowałem. – Gra

0

Fstrings

Jeśli używasz Python 3.6+ można skorzystać z nowej tzw f-strings co oznacza sformatowanych ciągów i może być stosowany przez dodanie znaku f na początku ciąg znaków identyfikujący to jako f-string.

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! 

głównych zalet korzystania z F-ciągi jest to, że są one bardziej czytelne, może być szybsze i oferują lepszą wydajność:

Źródło Pandy dla wszystkich: Python Analiza danych, przez Daniela Y. Chen

Benchmarki

nie ulega wątpliwości, że nowa f-strings są bardziej czytelne, jak nie masz do przemapować sznurki, b ut jest jednak szybszy, jak stwierdzono we wspomnianym cytacie?

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 

Running 10 milionów na badania wydaje się, że nowy f-strings są rzeczywiście szybciej w mapowaniu.

Powiązane problemy