2011-09-27 14 views
61

Konstruuję ciąg znaków s w Pythonie 2.6.5, który będzie miał różną liczbę tokenów %s, które pasują do liczby wpisów na liście x. Muszę napisać sformatowany ciąg. Poniższe nie działa, ale wskazuje, co próbuję zrobić. W tym przykładzie są trzy tokeny %s, a lista ma trzy wpisy.Używanie formatowania ciągów w języku Python z listami

s = '%s BLAH %s FOO %s BAR' 
x = ['1', '2', '3'] 
print s % (x) 

chciałbym ciąg wyjściowy będzie:

1 BLAH 2 FOO 3 BAR

Odpowiedz

17

następstwie tego resource page, jeśli długość x jest różny, możemy użyć:

', '.join(['%.2f']*len(x)) 

stworzyć uchwyt miejsce dla każdego elementu z lista x. Oto przykład:

x = [1/3.0, 1/6.0, 0.678] 
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x) 
print s 
>>> elements in the list are [0.33, 0.17, 0.68] 
74
print s % tuple(x) 

zamiast

print s % (x) 
+2

'(x)' jest tym samym co 'x'. Umieszczenie pojedynczego tokena w nawiasie nie ma znaczenia w języku Python. Zwykle umieszczasz nawiasy w 'foo = (bar,)', aby ułatwić czytanie, ale 'foo = bar,' robi dokładnie to samo. – patrys

+6

'print s% (x)' jest tym, co OP napisał, właśnie go cytowałem. – infrared

+0

Po prostu dostarczyłem wskazówkę językową, nie krytykując twojej odpowiedzi (w rzeczywistości dałem jej 1).Nie napisałeś 'foo = (bar,)' albo :) – patrys

99

Należy spojrzeć do metody Pythona format. Następnie można zdefiniować ciąg formatowania tak:

>>> s = '{0} BLAH {1} BLAH BLAH {2} BLAH BLAH BLAH' 
>>> x = ['1', '2', '3'] 
>>> print s.format(*x) 
'1 BLAH 2 BLAH BLAH 3 BLAH BLAH BLAH' 
+0

Tylko Python 2.6+. – agf

+1

OP używa 2.6.5 -> ok – glglgl

+1

Problem OP nie jest metodą, ale formatem parametrów. Operator '%' tylko rozpakowuje krotki. – patrys

11

Odkąd tylko dowiedziałem się o tym chłodnym rzeczy (indeksowanie w listach od wewnątrz ciągu format) Dodaję do tego starego pytanie.

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR' 
x = ['1', '2', '3'] 
print s.format (x=x) 

Jednak wciąż nie zorientowali się, jak to zrobić krojenia (wewnątrz łańcucha formatu '"{x[2:4]}".format...,) i chciałbym, aby zrozumieć to, czy ktoś ma pomysł, jednak podejrzewam, że po prostu nie można zrobić że.

+0

Jestem trochę ciekawa twojego przypadku użycia do krojenia. – Michael

+0

Naprawdę nie mam jednego ... myślę, że po prostu pomyślałem, że byłoby to fajnie móc robić –

4

To było zabawne pytanie! Innym sposobem radzenia sobie z tym przy pomocy metody .format dla list o zmiennej długości jest użycie funkcji, która w pełni wykorzystuje rozpakowanie list. W poniższym przykładzie nie używam żadnego fantazyjnego formatowania, ale można je łatwo zmienić w zależności od potrzeb.

list_1 = [1,2,3,4,5,6] 
list_2 = [1,2,3,4,5,6,7,8] 

# Create a function to easily repeat on many lists: 
def ListToFormattedString(alist): 
    # Each item is right-adjusted, width=3 
    formatted_list = ['{:>3}' for item in alist] 
    s = ','.join(formatted_list) 
    return s.format(*alist) 

# Example output: 
>>>ListToFormattedString(list_1) 
' 1, 2, 3, 4, 5, 6' 
>>>ListToFormattedString(list_2) 
' 1, 2, 3, 4, 5, 6, 7, 8' 
-1

i również jest to możliwe w python 3.6+ zrobić:

x = ['1', '2', '3'] 
print(f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR") 
0

Oto trochę improwizowana odpowiedź do korzystania z formatu wydruku() na liście.

Jak o tym: (py3)

sample_list = ['cat', 'dog', 'bunny', 'pig'] 
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list)) 

Czytaj docs tutaj o używaniu format.

Powiązane problemy