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.

Obaid
sumber
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]".

SingleNegationElimination
sumber
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.

reemer9997
sumber
15

Hanya menggunakan cetak:

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

Jika Anda menggunakan Python3:

print('[',end='');print(*L, sep=', ', end='');print(']')
Kabie
sumber
1
apa yang dilakukan print (* L) di sini?
sandeeps
1
Saya bingung dengan ini. Apakah tipe data yang panjang memfilter daftar?
dval
Versi yang lebih ringkas adalahprint(end='['); print(*l, sep=', ', end=']\n')
Anonim
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 ,,.

Seth Johnson
sumber
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.

martineau.dll
sumber
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'
Tom Zych
sumber
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

Ani Menon
sumber
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]
dicintai oleh Yesus
sumber