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.