Python Dize Biçimlendirmesini Listelerle Kullanma


112

sPython 2.6.5'te %s, listedeki girişlerin sayısıyla eşleşen, değişen sayıda jetona sahip bir dize oluşturuyorum x. Biçimlendirilmiş bir dizge yazmam gerekiyor. Aşağıdakiler işe yaramıyor, ancak ne yapmaya çalıştığımı gösteriyor. Bu örnekte, üç %ssimge vardır ve listede üç giriş vardır.

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

Çıktı dizesinin şöyle olmasını istiyorum:

1 BLAH 2 FOO 3 BAR

Yanıtlar:


112
print s % tuple(x)

onun yerine

print s % (x)

5
(x)ile aynı şeydir x. Tek bir belirteci parantez içine koymanın Python'da hiçbir anlamı yoktur. foo = (bar, )Okumayı kolaylaştırmak için genellikle parantez koyarsınız ama foo = bar,tam olarak aynı şeyi yapar.
patrys

11
print s % (x)OP'nin yazdığı buydu, sadece ondan alıntı yapıyordum.
kızılötesi

Cevabınızı eleştirmeden sadece bir dil ipucu veriyordum (aslında + 1'ledim). Sen de foo = (bar, )
yazmadın

2
(x)Açıklık için notasyonu kullanıyorum ; ayrıca daha sonra başka değişkenler eklerseniz parantezlerin unutulmasını da önler.
SabreWolfy

Değişkenlerinizi birden çok listeden elde etmek istiyorsanız nasıl olur? tuple yalnızca tek bir liste alıyor ve biçimlendirici yalnızca tek bir demeti alıyor gibi görünüyor
errant.info

150

Python'un format yöntemine bir göz atmalısınız . Daha sonra biçimlendirme dizenizi şu şekilde tanımlayabilirsiniz:

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

1
OP'nin sorunu yöntem değil, parametrelerin formatıdır. %operatör yalnızca demetleri çözer.
patrys

Bu, sbasitçe %sher konum için değil, artan sayıları eklemem gerekeceğinden, inşaatı daha karmaşık hale getirecektir . sbir dizi farklı adımda oluşturulur, bu nedenle yalnızca %sjetonu dahil etmek çok daha kolaydır .
SabreWolfy

2
Eğer precedurally sonra inşa ederse @SabreWolfy Eğer daha kolay tutucuları isim ve sonuç dizesini biçimlendirmek için bir dict kullanmak bulabilirsiniz: print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
patrys

2
@SabreWolfy: Python 2.7'de, alan numaralarını atlayabilirsiniz:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
sonraki duyuruya kadar duraklatıldı.

Bu cevap potansiyel olarak kafa karıştırıcıdır, çünkü 0, 1 ve 2'nin sayısal değerleri "BLAH" kelimesinin görünme sayısıyla bir şekilde ilişkilidir.
SabreWolfy

31

Bu kaynak sayfasını takip ederek, x'in uzunluğu değişiyorsa, kullanabiliriz:

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

Listedeki her öğe için bir yer tutucu oluşturmak için x. İşte örnek:

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]

1
Bağlantı artık öldü.
MK Hunter

19

İşte tek astar. Listeyi yinelemek için print () ile format kullanarak biraz doğaçlama cevap.

Buna ne dersiniz (python 3.x):

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

Format () kullanarak buradaki dokümanları okuyun .


18

Bu harika şeyi yeni öğrendiğimden beri (bir biçim dizesi içinden listelere indeksleme) bu eski soruya ekliyorum.

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

Çıktı:

1 BLAH 2 FOO 3 BAR

Bununla birlikte, nasıl dilimleme yapılacağını (biçim dizesinin içinde) hala bulamadım '"{x[2:4]}".format...ve herhangi birinin bir fikri olup olmadığını anlamayı çok isterim, ancak bunu yapamayacağından şüpheleniyorum.


Dilimleme için kullanım durumunuzu biraz merak ediyorum.
Michael

1
gerçekten bir tane yok ... sanırım yapabilmenin harika olacağını düşündüm
Joran Beasley

11

Bu eğlenceli bir soruydu! Değişken uzunluklu listelerde bunu halletmenin bir başka yolu da , .formatyöntem ve paket açma listesinden tam olarak yararlanan bir işlev oluşturmaktır . Aşağıdaki örnekte herhangi bir süslü biçimlendirme kullanmıyorum, ancak bu, ihtiyaçlarınıza uyacak şekilde kolayca değiştirilebilir.

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

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    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'

3

@ Neobot'un cevabı ile aynı, ancak biraz daha modern ve özlü.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

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

Çıktı

1 BLAH 2 FOO 3 BAR
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.