Menggunakan Pemformatan String Python dengan Daftar


112

Saya membuat string sdengan Python 2.6.5 yang akan memiliki jumlah %stoken yang bervariasi , yang cocok dengan jumlah entri dalam daftar x. Saya perlu menulis string yang diformat. Berikut ini tidak berhasil, tetapi menunjukkan apa yang saya coba lakukan. Dalam contoh ini, ada tiga %stoken dan daftarnya memiliki tiga entri.

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

Saya ingin string keluarannya menjadi:

1 BLAH 2 FOO 3 BAR

Jawaban:


112
print s % tuple(x)

dari pada

print s % (x)

5
(x)adalah hal yang sama dengan x. Menempatkan satu token dalam tanda kurung tidak ada artinya dalam Python. Anda biasanya memasukkan tanda kurung foo = (bar, )agar lebih mudah dibaca tetapi foo = bar,melakukan hal yang persis sama.
patrys

11
print s % (x)itulah yang OP tulis, saya hanya mengutip dia.
inframerah

Saya hanya memberikan tip bahasa, tidak mengkritik jawaban Anda (sebenarnya saya memberi +1). Anda juga tidak menulis foo = (bar, ):)
patrys

2
Saya menggunakan (x)notasi untuk kejelasan; itu juga menghindari lupa tanda kurung jika nanti Anda menambahkan variabel tambahan.
SabreWolfy

Bagaimana jika Anda ingin mendapatkan variabel Anda dari beberapa daftar? tuple hanya mengambil satu daftar, dan formatter tampaknya hanya mengambil satu tuple
errant.info

150

Anda harus melihat metode format python. Anda kemudian dapat menentukan string pemformatan Anda seperti ini:

>>> 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
Masalah OP bukanlah metodenya tetapi format parameternya. %operator hanya membongkar tupel.
patrys

Ini akan membuat konstruksi menjadi slebih kompleks, karena saya perlu memasukkan angka yang bertambah daripada hanya %suntuk setiap posisi. sdibuat dalam beberapa langkah berbeda, jadi lebih mudah untuk hanya menyertakan %stoken.
SabreWolfy

2
@SabreWolfy Jika Anda membangun itu precedurally maka Anda mungkin menemukan lebih mudah untuk nama penampung dan menggunakan dict untuk memformat string yang dihasilkan: print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
patrys

2
@SabreWolfy: Dengan Python 2.7, Anda dapat menghilangkan nomor bidang:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
Dijeda hingga pemberitahuan lebih lanjut.

Jawaban ini berpotensi membingungkan, karena membuatnya terlihat seperti nilai numerik 0, 1 dan 2 yang entah bagaimana terkait dengan berapa kali kata "BLAH" muncul.
SabreWolfy

31

Mengikuti halaman sumber daya ini , jika panjang x bervariasi, kita dapat menggunakan:

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

untuk membuat placeholder untuk setiap elemen dari daftar x. Berikut contohnya:

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
Tautannya sekarang sudah mati.
MK Hunter

19

Ini satu baris. Jawaban improvisasi kecil menggunakan format dengan print () untuk mengulang daftar.

Bagaimana dengan ini (python 3.x):

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

Baca dokumen di sini tentang menggunakan format () .


18

Karena saya baru belajar tentang hal keren ini (mengindeks ke dalam daftar dari dalam format string) saya menambahkan ke pertanyaan lama ini.

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

Keluaran:

1 BLAH 2 FOO 3 BAR

Namun, saya masih belum menemukan cara melakukan pemotongan (di dalam string format '"{x[2:4]}".format...,) dan ingin mengetahui apakah ada yang punya ide, namun saya curiga Anda tidak bisa melakukan itu.


Saya sedikit ingin tahu tentang kasus penggunaan Anda untuk mengiris.
Michael

1
saya tidak benar-benar memilikinya ... saya pikir saya hanya berpikir itu akan bagus untuk bisa melakukannya
Joran Beasley

11

Ini pertanyaan yang menyenangkan! Cara lain untuk menangani ini untuk daftar panjang variabel adalah dengan membuat fungsi yang memanfaatkan sepenuhnya .formatmetode dan pembongkaran daftar. Dalam contoh berikut saya tidak menggunakan pemformatan yang mewah, tetapi itu dapat dengan mudah diubah sesuai kebutuhan Anda.

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

Sama dengan jawaban @ neobot tetapi sedikit lebih modern dan ringkas.

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

Outputnya adalah

1 BLAH 2 FOO 3 BAR
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.