Bagaimana cara mencetak daftar dengan "benar"?


95

Jadi saya punya daftar:

['x', 3, 'b']

Dan saya ingin hasilnya menjadi:

[x, 3, b]

Bagaimana saya bisa melakukan ini dengan python?

Jika saya melakukannya str(['x', 3, 'b']), saya mendapatkannya dengan kutipan, tetapi saya tidak ingin kutipan.


Untuk menjelaskan mengapa daftar tidak dicetak "dengan benar", print(["Sam"])panggilan repr("Sam"), yang mengembalikan 'Sam'(dengan tanda kutip), tidak seperti saat Anda memanggil print("Sam")dan panggilan python str("Sam")yang kembali Sam(tanpa tanda kutip). Lihat perbedaan antara strdanrepr atau Python strdan lists untuk info lebih lanjut.
Anonim

Jawaban:


188

Dengan Python 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

Di Python 3 (di mana printada fungsi bawaan dan bukan fitur sintaks lagi):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Keduanya kembali:

[x, 3, b]

Ini menggunakan map()fungsi untuk memanggil str untuk setiap elemen mylist , membuat daftar string baru yang kemudian digabungkan menjadi satu string dengan str.join(). Kemudian, %operator pemformatan string menggantikan string dalam alih-alih %sdalam "[%s]".


4
Terima kasih, itu berfungsi dengan baik. Bisakah Anda menjelaskan sedikit secara detail tentang apa yang Anda lakukan di baris kedua? Saya baru mengenal python.
Obaid

19
Dia menggunakan mapfungsi untuk memanggil strsetiap elemen mylist, membuat daftar string baru yang kemudian dia gabungkan menjadi satu string str.join. Kemudian, dia menggunakan %operator pemformatan string untuk menggantikan string di %sdalam "[%s]".
li.davidm

6
Cara lain untuk melakukannya yang mungkin sedikit lebih modern: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor

2
saya cenderung lebih suka map(f, xs)(atau imapdi python2.x) daripada (f(x) for x in xs), ketika fcallable yang telah ditentukan; yang cenderung mengeksekusi bytecode lebih sedikit, dan biasanya lebih kompak. Tentu tidak itu map(lambda x:..., xs) jauh lebih buruk daripada(... for x in xs)
SingleNegationElimination

1
@ user1767754: benarkah? Tautan?
SingleNegationElimination

18

Ini adalah kode sederhana, jadi jika Anda baru, Anda harus memahaminya dengan cukup mudah.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

Ini mencetak semuanya tanpa tanda kutip, seperti yang Anda inginkan.


15

Hanya menggunakan cetak:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b


9

Alih-alih menggunakan map, saya merekomendasikan menggunakan ekspresi generator dengan kemampuan joinuntuk menerima iterator:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Di sini, joinadalah fungsi anggota kelas string str. Dibutuhkan satu argumen: daftar (atau iterator) string, lalu mengembalikan string baru dengan semua elemen yang digabungkan oleh, dalam hal ini ,,.


2
Pengoptimalan yang baik untuk Python 2, karena map mengembalikan daftar di 2.x. Ini mengembalikan generator di 3.x, jadi tidak banyak membantu di sana.
Tom Zych

7
Saya akan kembali", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem

@eyquem: Pintar, saya belum pernah melihat join digunakan seperti itu sebelumnya. Namun, itu sedikit lebih buram bagi pemula (karena Anda menggunakan properti bahwa string adalah wadah berulang dari string satu karakter).
Seth Johnson

6

Anda dapat menghapus semua karakter yang tidak diinginkan dari string menggunakan translate()metode dengan Noneuntuk tableargumen diikuti dengan string yang berisi karakter yang ingin Anda hapus untuk deletecharsargumennya.

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Jika Anda menggunakan versi Python sebelum 2.6, Anda harus menggunakan fungsi stringmodul translate()sebagai gantinya karena kemampuan untuk meneruskan Nonesebagai tableargumen tidak ditambahkan hingga Python 2.6. Menggunakannya terlihat seperti ini:

import string

print string.translate(str(lst), None, "'")

Menggunakan string.translate()fungsi ini juga akan berfungsi di 2.6+, jadi menggunakannya mungkin lebih disukai.


2
Sayangnya: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]dan juga denganlst = ['it isn\'t', 3, 'b']
eyquem

1
@eyquem: Ya, menghindari penghapusan karakter yang sebenarnya merupakan bagian dari data Anda (bukan hanya digunakan untuk membatasi) secara alami akan membutuhkan logika yang sedikit lebih rumit / berbeda jika memungkinkan.
martineau

3

Berikut adalah sesi interaktif yang menampilkan beberapa langkah dalam satu baris @ TokenMacGuy. Pertama, dia menggunakan mapfungsi untuk mengubah setiap item dalam daftar menjadi string (sebenarnya, dia membuat daftar baru, bukan mengubah item di daftar lama). Kemudian dia menggunakan metode string joinuntuk menggabungkan string-string itu di ', 'antara mereka. Sisanya hanya pemformatan string, yang cukup mudah. (Sunting: contoh ini mudah; pemformatan string secara umum bisa agak rumit.)

Perhatikan bahwa menggunakan joinadalah cara sederhana dan efisien untuk membuat string dari beberapa substring, jauh lebih efisien daripada melakukannya dengan menambahkan string ke string secara berturut-turut, yang melibatkan banyak penyalinan di belakang layar.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'

2

Menggunakan .formatuntuk pemformatan string,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Keluaran:

[x, 3, b]

Penjelasan:

  1. mapdigunakan untuk memetakan setiap elemen dari daftar yang akan stringdiketik.
  2. Elemen-elemen tersebut digabungkan menjadi sebuah string dengan ,sebagai pemisah.
  3. Kami menggunakan [dan ]dalam pernyataan cetak untuk menunjukkan kurung kurawal daftar.

Referensi: .formatuntuk pemformatan string PEP-3101


Bagus! Saya menemukan menggunakan .formatcara yang paling pythonic. Tapi, tentu saja, saya menerima ketidaksetujuan. ;)
dicintai oleh Yesus

0

Saya terinspirasi oleh @AniMenon untuk menulis solusi pythonic yang lebih umum.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Itu hanya menggunakan formatmetode. Tidak ada jejak str, dan ini memungkinkan penyempurnaan format elemen. Misalnya, jika Anda memiliki angka float sebagai elemen daftar, Anda dapat menyesuaikan formatnya, dengan menambahkan penentu konversi, dalam hal ini:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

Outputnya cukup baik:

[1.85, -6.33, 4000.21]
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.