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?

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

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

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.


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.