Python string.join (daftar) pada array objek daripada string array

291

Dengan Python, saya bisa melakukan:

>>> list = ['a', 'b', 'c']
>>> ', '.join(list)
'a, b, c'

Apakah ada cara mudah untuk melakukan hal yang sama ketika saya memiliki daftar objek?

>>> class Obj:
...     def __str__(self):
...         return 'name'
...
>>> list = [Obj(), Obj(), Obj()]
>>> ', '.join(list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, instance found

Atau apakah saya harus menggunakan for for loop?

Tikar
sumber

Jawaban:

432

Anda bisa menggunakan pemahaman daftar atau ekspresi generator sebagai gantinya:

', '.join([str(x) for x in list])  # list comprehension
', '.join(str(x) for x in list)    # generator expression
Adam Rosenfield
sumber
3
atau ekspresi generator: ',' .join (str (x) untuk daftar x in)
dF.
1
ada ide yang lebih cepat dari mereka?
gozzilli
Eksperimen saya mengatakan bahwa pemahaman daftar satu dapat menjadi 60% lebih baik pada daftar kecil (percobaan berjalan 10 ^ 6 kali pada daftar tiga objek () s). Namun, kinerjanya serupa pada daftar besar (percobaan ke-2 dijalankan sekali pada daftar 10 ^ 7 objek ()).
gozzilli
3
untuk peningkatan kecepatan 30% yang baik (lebih dari ekspresi generator di atas), seseorang dapat menggunakan mapekspresi yang seharusnya kurang dapat dibaca (di bawah).
K3 --- rnc
2
Jawaban ini secara objektif lebih buruk daripada mapsolusinya.
PascalVKooten
96

Konstruktor string bawaan akan secara otomatis memanggil obj.__str__:

''.join(map(str,list))
Triptych
sumber
1
map () tidak mengubah daftar, itu setara dengan [str (o) untuk o dalam daftar]
dF.
11
+1: Peta adalah pendekatan yang baik; "mengubah daftar" bukanlah komentar yang akurat.
S.Lott
2
(lain) +1 .. peta tidak lebih mudah dibaca, hanya perlu tahu apa fungsi peta
lapax
1
@Michael Tidak benar. reduceadalah salah satu yang dihapus, karena biasanya membuat orang menebak dan dengan demikian tidak "pythonic". mapdi sisi lain bukan masalah.
PascalVKooten
1
(lainnya) +1: berasal dari dunia Perl, ini adalah hal yang paling umum di alam semesta: join ("sep", list) - dan semua elemen daftar dapat dikonversi ke representasi string mereka. Saya sudah benar-benar berjuang untuk menemukan solusi dalam python.
Jason
2

solusi lain adalah mengganti operator gabungan dari kelas str.

Mari kita mendefinisikan kelas baru my_string sebagai berikut

class my_string(str):
    def join(self, l):
        l_tmp = [str(x) for x in l]
        return super(my_string, self).join(l_tmp)

Maka Anda bisa melakukannya

class Obj:
    def __str__(self):
        return 'name'

list = [Obj(), Obj(), Obj()]
comma = my_string(',')

print comma.join(list)

dan kamu dapatkan

name,name,name

BTW, dengan menggunakan daftar sebagai nama variabel, Anda mendefinisikan ulang kelas daftar (kata kunci)! Lebih disukai menggunakan nama pengenal lain.

Semoga jawaban saya bermanfaat.

Nassim Seghir
sumber
1

Saya tahu ini adalah posting yang sangat lama, tapi saya pikir apa yang terlewatkan adalah yang utama __repr__, sehingga __repr__ = __str__, yang merupakan jawaban yang diterima dari pertanyaan ini ditandai duplikat .

NotAnAmbiTurner
sumber