Drukowanie krotki z formatowaniem ciągów znaków w Pythonie


127

Więc mam ten problem. Mam krotkę (1,2,3), którą powinienem wydrukować z formatowaniem ciągów. na przykład.

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

a to powinno wypisać reprezentację krotki w nawiasach, jak

To jest krotka (1, 2, 3)

Ale TypeError: not all arguments converted during string formattingzamiast tego dostaję .

Jak, u licha, jestem w stanie to zrobić? Trochę się tu zgubiłem, więc gdybyście mogli wskazać mi właściwy kierunek :)

Odpowiedzi:


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

Tworzenie krotki pojedynczej z krotką będącą przedmiotem zainteresowania jako jedyną pozycją, tj. (thetuple,)Częścią, jest tutaj kluczowym bitem.


W Pythonie 3 print jest funkcją, a nie instrukcją, więc musisz pisać print(....).
JG

53

Zauważ, że %składnia jest przestarzała. Użyj str.format, która jest prostsza i bardziej czytelna:

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

Dodałem komentarz do tego stackoverflow.com/a/26249755/1676424 w przypadku krotki 1 pozycji
Jacob CUI

Nigdy nie wiedziałem, dlaczego %jest przestarzały, ale teraz i str.formattak zawsze ty , na ślepo. Nieważne, interesuje mnie, czym jest pełny kwalifikator, ponieważ prosty {0}nie jest pełnym kwalifikatorem, a jedynie wskaźnikiem pozycji. Dla inttego, co nazywam pełnym kwalifikatorem, byłoby {0:d}(lub {3:d}na przykład, jeśli int do wydrukowania występuje na czwartej pozycji w str.formatmetodzie). Próbowałem wydrukować krotkę za pomocą {0:s}kwalifikatora, ale to nie działa. Więc jaki jest pełny kwalifikator czegoś takiego jak krotka?
Ray

1
@Ray To nie ma sensu. Istnieje wiele opcji, które możesz określić, które można znaleźć w dokumentacji. Jeśli chcesz coś wydrukować str, możesz powiedzieć {!s}, ale jest to ustawienie domyślne, więc nie jest to konieczne. Jeśli chcesz użyć reprzamiast tego, możesz to zrobić {!r}. W przeciwieństwie do z %, nie ma potrzeby mówić do liczbach całkowitych.
Antymon

2
Lubię składnię%, ponieważ jest mniej szczegółowa dla mojego umysłu niż nowy format, a także bardzo podobna do formatowania ciągów c, które znam i uwielbiam
Paulus

Zauważ, że nawet w Pythonie 3 %nie jest on całkowicie przestarzały. W rzeczywistości pylintbędzie nawet narzekać, jeśli użyjesz .formatskładni w loggingmodule: stackoverflow.com/a/34634301/534238
Mike Williamson

39

Wiele odpowiedzi udzielonych powyżej było poprawnych. Właściwy sposób to:

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

Jednak spór dotyczył tego, czy '%'operator ciągu znaków jest przestarzały. Jak wielu zauważyło, zdecydowanie nie jest przestarzały, ponieważ '%'operator String łatwiej jest połączyć instrukcję String z danymi listy.

Przykład:

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

Jednak używając tej .format()funkcji, otrzymasz pełną instrukcję.

Przykład:

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

Co więcej, '%'operator również przydatny dla nas, aby potwierdzić typ danych, takich jak łańcuch %s, %d, %i, podczas gdy .format () obsługuje tylko dwie flagi konwersji : '!s'a '!r'.


Przeszedłem na format (), ale ta zaleta metody% (możliwość formatowania każdego elementu krotki i wykonywania konwersji) jest duża, więc myślę, że wrócę. Dzięki.
Bill

1
Możesz również określić format dla każdego elementu. '{: d} {: s}'. format (1, '2')
zk82

5
W „gwiazdka rozpakowane” krotka dobrze współpracuje z .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)
>>>

Zwróć uwagę, że (tup,)jest to krotka zawierająca krotkę. Zewnętrzna krotka jest argumentem operatora%. Wewnętrzna krotka to jej zawartość, która jest faktycznie drukowana.

(tup)jest wyrażeniem w nawiasach, które po ocenie daje tup.

(tup,)z końcowym przecinkiem jest krotką, która zawiera tupjako jedyny element członkowski.


9

To nie używa formatowania ciągów, ale powinieneś być w stanie to zrobić:

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

Jeśli naprawdę chcesz użyć formatowania ciągów:

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

Uwaga, zakłada się, że używasz wersji Pythona wcześniejszej niż 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

Chociaż to pytanie jest dość stare i ma wiele różnych odpowiedzi, nadal chciałbym dodać najbardziej „pytoniczną”, a także czytelną / zwięzłą odpowiedź.

Ponieważ ogólna tuplemetoda drukowania jest już poprawnie pokazana przez Antimony, jest to dodatek do drukowania każdego elementu w krotce osobno, jak Fong Kah Chun poprawnie pokazał %sskładnię.

Co ciekawe, wspomniano o tym tylko w komentarzu, ale użycie operatora gwiazdki do rozpakowania krotki daje pełną elastyczność i czytelność przy zastosowaniu str.formatmetody przy oddzielnym drukowaniu elementów krotki .

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

Pozwala to również uniknąć drukowania końcowego przecinka podczas drukowania jednoelementowej krotki, co jest omijane przez Jacob CUI z replace. (Nawet jeśli reprezentacja imho na końcu przecinka jest poprawna, jeśli chcesz zachować reprezentację typu podczas drukowania ):

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

5

Myślę, że najlepszym sposobem na to jest:

t = (1,2,3)

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

Jeśli znasz formatowanie w stylu printf , to Python obsługuje własną wersję. W Pythonie odbywa się to za pomocą operatora „%” zastosowanego do łańcuchów (przeciążenie operatora modulo), który pobiera dowolny ciąg i stosuje do niego formatowanie w stylu printf.

W naszym przypadku każemy mu wypisać "To jest krotka:", a następnie dodać ciąg "% s", a dla rzeczywistego ciągu przekazujemy ciąg reprezentujący krotkę (przez wywołanie str ( t)).

Jeśli nie jesteś zaznajomiony z formatowaniem w stylu printf, bardzo polecam naukę, ponieważ jest to bardzo standardowe. Większość języków obsługuje to w taki czy inny sposób.


2

Pamiętaj, że na końcu krotki zostanie dodany przecinek, jeśli krotka zawiera tylko jeden element. na przykład:

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

a otrzymasz:

'this is a tuple (1,)'

w niektórych przypadkach np. chcesz otrzymać listę w cudzysłowie do użycia w ciągu zapytania mysql, np

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

musisz wziąć pod uwagę, aby usunąć przecinek kończący, użyj replace (',)', ')') po sformatowaniu, ponieważ jest możliwe, że krotka ma tylko 1 element, taki jak ('Tom',), więc przecinek kończący musi zostać usunięty:

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

Proszę zasugerować, czy masz przyzwoity sposób na usunięcie tego przecinka z wyniku.


1
Zwykle wolę coś w stylu „to jest krotka ({})”. Format („,” .join (map (str, t))). W ten sposób nie musisz się martwić o zepsucie istniejących przecinków lub nawiasów w ciągu formatu.
Antymon

1
Nie powinieneś używać format()w zapytaniach do bazy danych. W każdej bibliotece istnieją odpowiednie metody.
ktalik

@ktalik Oczywiście tego nie rozumiesz. format () nie ma nic wspólnego z zapytaniami do bazy danych. format () jest typową funkcją operacji na łańcuchach znaków w Pythonie. Zajrzyj na docs.python.org/2/library/string.html, a nauczysz się z niego. Nie ma nic wspólnego z zapytaniami do bazy danych.
Jacob CUI

Używanie format()z wartościami zebranymi od użytkowników może skutkować iniekcją SQL. Bezpieczniej jest sprawdzić poprawność wartości wejściowych przed umieszczeniem ich w zapytaniu. Więcej informacji można znaleźć w tych wskazówkach: dev.mysql.com/doc/connector-python/en/… Można także rzutować wartości parametrów na reprezentację typu ciągu bazy danych, a następnie wkleić je do ciągu zapytania. Spójrz na initd.org/psycopg/docs/usage.html, gdzie masz kontrprzykład z %operatorem i rozwiązanie z execute()metodą, w której parametry zapytania są przekazywane w argumentach metody.
ktalik

1
@Paul Rooney Proszę zauważyć, że próbuję wyjaśnić, że na końcu krotki zostanie dodany przecinek, jeśli krotka zawiera tylko jedną pozycję. I spowoduje problemy, jeśli nie będzie używany prawidłowo. Również format z pewnością może być użyty do tworzenia zapytań SQL. Skąd się biorą krytycy ??
Jacob CUI


0

Spróbuj tego, aby uzyskać odpowiedź:

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

Jeśli umieścimy tylko jedną krotkę wewnątrz (), sama utworzy krotkę:

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

Oznacza to, że powyższa instrukcja print będzie wyglądać następująco: print ("Wartość:% s"% ('1', '2')), co jest błędem!

W związku z tym:

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

Powyższe zostanie poprawnie wprowadzone do argumentów wydruku.



0

Możesz też spróbować tego;

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

Nie możesz używać tylko %somethingz (tup)powodu koncepcji pakowania i rozpakowywania z krotką.


-5

Rozmowa jest tania, pokaż kod:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.