Python'da dize formatlaması ile demeti yazdırma


127

Yani, bu problemim var. Dize biçimlendirmesi ile yazdırmam gereken tuple (1,2,3) var. Örneğin.

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

ve bu, tuple temsilini parantezlerle yazdırmalıdır, örneğin

Bu bir demettir (1,2,3)

Ama TypeError: not all arguments converted during string formattingonun yerine alırım .

Bunu nasıl yapabilirim? Burada bir çeşit kayboldu, bu yüzden beni doğru bir yöne yönlendirirseniz :)

Yanıtlar:


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

Tek öğe olarak ilgilenilen demet ile bir singleton tuple yapmak, yani (thetuple,)parça, burada anahtar bittir.


Python 3'te yazdırma bir ifade değil işlevdir, bu yüzden yazmanız gerekir print(....).
JG

53

%Sözdiziminin eski olduğuna dikkat edin . str.formatDaha basit ve daha okunaklı olan kullanın :

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

1 öğeli tuple için bu stackoverflow.com/a/26249755/1676424'e bir yorum ekledim
Jacob CUI

Neden %modası geçmiş olduğunu hiç bilmiyordum ama şimdi her zaman sen str.formatyine de körü körüne. Bunu boşverin, tam niteleyicinin ne olduğu ile ilgileniyorum çünkü basit {0}, tam niteleyici değil, sadece bir konum göstergesi. Bir için int, tam niteleyici olarak adlandırdığım şey şöyle olacaktır {0:d}(veya {3:d}örneğin, yazdırılacak int, str.formatyöntemde 4. konumda gerçekleşirse ). Niteleyiciyi kullanarak bir demet yazdırmayı denedim, {0:s}ancak çalışmıyor. Öyleyse, bir demet gibi bir şey için tam niteleyici nedir?
Ray

1
@Ray Bu gerçekten mantıklı değil. Belgelerde bulabileceğiniz, belirtebileceğiniz birçok seçenek vardır. Kullanarak bir şeyler yazdırmak stristiyorsanız diyebilirsiniz {!s}, ancak bu varsayılandır, bu yüzden gereksizdir. reprBunun yerine kullanmak istiyorsanız, yapabilirsiniz {!r}. İle aksine %, dtamsayılar için söylemeye gerek yoktur .
Antimon

2
Aklımda yeni formattan daha az ayrıntılı olduğu ve aynı zamanda bildiğim ve sevdiğim c string formatlamasına çok benzediği için% sözdizimini seviyorum
Paulus

Python 3'te bile %tamamen eski olmadığını unutmayın. Aslında, pylintkullanmak bile şikayet edecek .formatdahilinde sözdizimi logging: modül stackoverflow.com/a/34634301/534238
Mike Williamson

39

Yukarıda verilen cevapların çoğu doğruydu. Bunu yapmanın doğru yolu:

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

Ancak, '%'String operatörünün eski olup olmadığı konusunda bir anlaşmazlık vardı . Birçoğunun belirttiği gibi, '%'String operatörü bir String ifadesini bir liste verisiyle birleştirmek daha kolay olduğundan , kesinlikle eski değildir .

Misal:

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

Bununla birlikte, .format()işlevi kullandığınızda ayrıntılı bir ifade elde edeceksiniz.

Misal:

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

Dahası, '%'bize bu gibi veri tipini doğrulamak için de yararlı dizi operatörün %s, %d, %i, .format () ise sadece iki dönüşüm bayrakları destek : '!s've '!r'.


Format () kullanmaya geçiş yaptım ancak% yönteminin bu avantajı (bir demetin her bir öğesini biçimlendirip dönüştürme yapabilmek) büyük, bu yüzden geri döneceğimi düşünüyorum. Teşekkürler.
Bill

1
Her eleman için format da belirtebilirsiniz. '{: d} {: s}'. format (1, '2')
zk82

5
Tanımlama grubu ile iyi çalışır "yıldız çözdükten" .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)
>>>

Bunun (tup,)bir demet içeren bir demet olduğunu unutmayın. Dış demet,% operatörünün argümanıdır. İç tuple, aslında basılan içeriğidir.

(tup)köşeli parantez içindeki bir ifadedir ve değerlendirildiğinde ile sonuçlanır tup.

(tup,)sondaki virgül tup, yalnızca üye olduğu gibi içeren bir demettir .


9

Bu, dize biçimlendirmesini kullanmaz, ancak şunları yapabilmeniz gerekir:

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

Gerçekten dize biçimlendirmesini kullanmak istiyorsanız:

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

Not, bu, 3.0'dan önceki bir Python sürümünü kullandığınızı varsayar.


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

Bu soru oldukça eski olmasına ve birçok farklı cevabı olmasına rağmen, yine de en çok "pitonik" ve aynı zamanda okunabilir / özlü cevabı eklemek istiyorum.

Genel tuplebaskı yöntemi Antimony tarafından zaten doğru şekilde gösterildiğinden, bu, Fong Kah Chun'un %ssözdizimi ile doğru bir şekilde gösterdiği gibi, bir demetteki her bir öğeyi ayrı ayrı yazdırmak için bir eklemedir .

İlginç bir şekilde, yalnızca bir yorumda bahsedilmişti, ancak tuple'ı açmak için bir yıldız işareti operatörü kullanmak, tuple öğelerini ayrı ayrı yazdırırkenstr.format yöntemi kullanarak tam esneklik ve okunabilirlik sağlar .

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

Bu ayrıca, Jacob CUI tarafından atlatıldığı gibi, tek öğeli bir demet yazdırırken sondaki virgül yazdırılmasını da önler replace. ( Yazdırırken tür gösterimini korumak istiyorsanız , sondaki virgül gösterimi doğru olsa da ):

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

5

Sanırım bunu yapmanın en iyi yolu:

t = (1,2,3)

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

Printf stili biçimlendirmeye aşina iseniz , Python kendi sürümünü destekler. Python'da bu, dizelere uygulanan "%" operatörü (modulo operatörünün aşırı yüklenmesi) kullanılarak yapılır ve bu, herhangi bir dizeyi alır ve ona printf tarzı biçimlendirme uygular.

Bizim durumumuzda, ona "Bu bir demet:" yazmasını söylüyoruz ve ardından bir "% s" dizesi ekliyoruz ve gerçek dize için, demetin bir dize temsilini iletiyoruz (str ( t)).

Printf stili biçimlendirmeye aşina değilseniz, çok standart olduğu için öğrenmenizi şiddetle tavsiye ederim. Çoğu dil bunu bir şekilde destekler.


2

Demette yalnızca bir öğe varsa sondaki virgül ekleneceğini lütfen unutmayın. Örneğin:

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

ve alacaksın:

'this is a tuple (1,)'

bazı durumlarda, örneğin mysql sorgu dizesinde kullanılmak üzere alıntılanmış bir liste almak istersiniz.

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

Biçimlendirmeden sonra kuyruk virgülünü kaldırmayı düşünmeniz gerekir, çünkü dizide ('Tom',) gibi yalnızca 1 öğe olabilir, bu nedenle kuyruk virgülünün kaldırılması gerekir:

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

Lütfen çıktıdaki bu virgülü kaldırmak için uygun bir yolunuz olup olmadığını önerin.


1
Genellikle 'bu bir demettir ({})'. Format (',' .join (harita (str, t))) gibi bir şey tercih ederim. Bu şekilde, biçim dizesindeki mevcut virgül veya parantezlerle uğraşmak zorunda kalmazsınız.
Antimon

1
format()Veritabanı sorgularında kullanmamalısınız . Her kütüphanede bunun için uygulanabilir yöntemler vardır.
ktalik

@ktalik bunu açıkça anlamıyorsun. format () 'ın veritabanı sorgularıyla ilgisi yoktur. format (), python dizesi işleminin ortak işlevidir. Docs.python.org/2/library/string.html adresine bir göz atın ve ondan öğreneceksiniz. Veritabanı sorgularıyla hiçbir ilgisi yoktur.
Jacob CUI

format()Kullanıcılardan toplanan değerlerle kullanmak SQL enjeksiyonu ile sonuçlanabilir. Giriş değerlerini sorguya koymadan önce doğrulamak daha güvenlidir. Daha fazla bilgi için şu yönergelere bakın: dev.mysql.com/doc/connector-python/en/… Ayrıca, parametre değerlerini bir veritabanı türü dizesi temsiline çevirebilir ve ardından sorgu dizesine yapıştırabilirsiniz. İnitd.org/psycopg/docs/usage.html adresinde %operatörlü bir karşı örnek ve execute()sorgu parametrelerinin yöntem bağımsız değişkenlerinde iletildiği yöntem içeren bir çözüme sahip olduğunuz yere bakın.
ktalik

1
@Paul Rooney Lütfen açıklamaya çalıştığımı unutmayın, dizide yalnızca bir öğe varsa sondaki virgül eklenecektir. VE doğru kullanılmazsa soruna neden olur. Ayrıca format kesinlikle SQL sorguları oluşturmak için kullanılabilir. İftiracılar nereden geliyor?
Jacob CUI

2

Diğer yanıtlarda önerilen yöntemlerin yanı sıra, Python 3.6'dan beri Değişmez Dize Enterpolasyonunu (f-dizeleri) de kullanabilirsiniz :

>>> tup = (1,2,3)
>>> print(f'this is a tuple {tup}')
this is a tuple (1, 2, 3)

0

Bir cevap almak için şunu deneyin:

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

() İçine yalnızca bir demet koyarsak, kendisi bir demet oluşturur:

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

Bu, yukarıdaki print ifadesinin şöyle görüneceği anlamına gelir: print ("Değer:% s"% ('1', '2')) ki bu bir hatadır!

Dolayısıyla:

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

Yukarıdakiler, baskının argümanlarına doğru şekilde beslenecektir.


0

Python 3 için

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

0

Bunu da deneyebilirsiniz;

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

Sen kullanamazsınız %somethingile (tup)sırf paketleme ve tuple ile kavramının özüne ait.


-5

Konuşma ucuz, size kodu gösterin:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.