Ubah daftar karakter menjadi string

415

Jika saya memiliki daftar karakter:

a = ['a','b','c','d']

Bagaimana cara mengubahnya menjadi string tunggal?

a = 'abcd'
tidak
sumber
7
Tautan ke arah lain
Tobias Kienzler

Jawaban:

585

Gunakan joinmetode string kosong untuk menggabungkan semua string bersama-sama dengan string kosong di antaranya, seperti:

>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
Daniel Stutzbach
sumber
1
bagaimana cara menambahkan spasi di antara karakter? lagi pula untuk melakukannya tanpa mengulangi semuanya?
clifgray
18
lakukan saja ' '.join(list)dengan spasi di antara tanda kutip
clifgray
Hal yang menyenangkan tentang ini adalah Anda dapat menggunakan '\ n'.join (a) jika Anda ingin menulis daftar ke txt dengan baris baru untuk setiap item
Norfeldt
28
Untuk memperjelas: "".join(['a','b','c'])berarti Join all elements of the array, separated by the string "". Dengan cara yang sama, " hi ".join(["jim", "bob", "joe"])akan dibuat "jim hi bob hi joe".
Jack
39

Ini berfungsi dalam banyak bahasa populer seperti JavaScript dan Ruby, mengapa tidak menggunakan Python?

>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'

Cukup aneh, dengan Python joinmetode ini ada di strkelas:

# this is the Python way
"".join(['a','b','c','d'])

Mengapa joinbukan metode pada listobjek seperti pada JavaScript atau bahasa skrip populer lainnya? Ini adalah salah satu contoh bagaimana komunitas Python berpikir. Karena bergabung adalah mengembalikan string, itu harus ditempatkan di kelas string, bukan pada kelas daftar, jadi str.join(list)metode ini berarti: bergabung dengan daftar ke string baru menggunakan strsebagai pemisah (dalam hal ini stradalah string kosong).

Entah bagaimana saya harus menyukai cara berpikir ini setelah beberapa saat. Saya bisa mengeluh tentang banyak hal dalam desain Python, tetapi tidak tentang koherensinya.

Paulo Scardine
sumber
1
Alasan utama untuk bergabung menjadi metode string daripada metode daftar adalah karena ia menerima setiap iterable , bukan hanya daftar. Anda dapat menggunakan ekspresi generator, kamus, set, tampilan berbagai jenis, dan sebagainya. Jadi ini jauh lebih fleksibel daripada operasi gabungan array di sebagian besar bahasa.
rosuav
Saya membandingkan Python string.join()dengan kebanyakan koleksi yang memiliki join()metode dalam banyak bahasa dinamis. Tentang iterables, saya kira itu bukan masalah untuk bahasa seperti itu karena itu mudah (dan dapat dibaca) untuk menyertakan iterable dalam koleksi konstruktor dan rantai dalam join()metode ini.
Paulo Scardine
Ya, dengan asumsi mereka memiliki daftar malas (gaya Haskell) atau Anda merasa nyaman untuk menggabungkan daftar itu ke dalam memori sebelum memulai. Maksud saya adalah bahwa cara Python melakukan tidak sewenang-wenang, tetapi memiliki justifikasi yang sangat baik.
rosuav
1
Ini bukan sembarang, itu adalah keputusan desain untuk menghindari polusi namespace di setiap kelas. :-)
Paulo Scardine
Persis. Plus, tidak semua dari mereka bahkan kelas - "iterable" adalah protokol, bukan kelas. Anda dapat memfilter, memetakan, bergabung, dll, menggunakan iterable.
rosuav
15

Jika juru bahasa Python Anda sudah tua (1.5.2, misalnya, yang umum pada beberapa distribusi Linux yang lebih lama), Anda mungkin tidak join()tersedia sebagai metode pada objek string lama, dan Anda harus menggunakan modul string. Contoh:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

String bakan menjadi 'abcd'.

Kyle
sumber
10

Ini mungkin cara tercepat:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
bigeagle
sumber
4
@ WinstonEwert ya, kemarin saya menulis sebuah program yang perlu melakukan hal seperti itu, dan saya membandingkan beberapa cara agar kinerja baris ini diperhitungkan dalam program saya, hasilnya menunjukkan sekitar 20% lebih cepat saat itu''.join(['a','b','c'])
bigeagle
2
Acara benchmark saya sendiri bergabung menjadi 7 kali lebih cepat. pastebin.com/8nSc5Ek1 . Anda keberatan membagikan tolok ukur Anda?
Winston Ewert
1
@ WinstonEwert Anda benar. Saya telah menemukan alasan untuk ini: dalam program saya, saya menemukan daftar int dari jaringan kemudian mengkonversi ke string di mana map(ord,a)tidak perlu, tetapi bergabung dengan kebutuhan map(chr,a). Ini patokan pastebin.com/1sKFm8ma
bigeagle
15
Optimalisasi prematur. Ini sangat sulit dibaca dan dipahami apa yang terjadi. Kecuali jika pengguna MEMBUTUHKAN kinerja dalam operasi, yang sederhana ''.join()jauh lebih mudah dibaca.
Luiz Damim
5
tidak setuju - programmer perlu mengingat metode tercepat untuk hal-hal seperti itu. operasi tunggal yang memakan waktu sedikit lebih lama bukanlah masalah besar. Namun, ini adalah bagaimana hampir setiap program yang ditulis berakhir kembung dan memakan terlalu banyak sumber daya. Ketika kita tidak menempatkan diri kita dalam kebiasaan membuat hal-hal yang semaksimal mungkin, kita berakhir dengan dunia yang seperti .... yah, seperti Windows Vista, atau pemula di Linux adalah contoh yang baik dari banyak cara pintas kecil yang mengarah ke 'mengasapi dan mengapung', seperti mati di dalam air. mereka berdua jelek juga. mengapa tidak menggunakan str (). join (a) yang 100% imfif ekspresif ..
osirisgothra
4

Fungsi pengurangan juga berfungsi

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
cce
sumber
1
Selalu menggangguku karena operatornya bukan warga negara kelas satu. Dalam skema, misalnya, itu akan menjadi (mengurangi + h)
Brian Minton
Dalam skema, (reduce + '' h)atau (apply + h)akan berhasil. Tetapi sekali lagi, dalam Python, operator add mengambil tepat 2 operan, maka kebutuhan untuk mengurangi. Jika tidak, Anda dapat melakukannya operator.add(*h), karena applytelah secara resmi ditinggalkan dalam Python untuk sintaks panggilan yang diperpanjang (alias en.wikipedia.org/wiki/Variadic_function )
Brian Minton
3

Jika daftar berisi nomor, Anda dapat menggunakan map()dengan join().

Misalnya:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459
yask
sumber
sebenarnya lebih pythonic untuk digunakan''.join([str(i) for i in arr])
user1767754
@ user1767754 Yah, Guido lebih suka gaya itu tapi sama sekali tidak ada yang salah dengan menggunakan fungsi peta.
itsbruce
2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'
Tagihan
sumber
6
Ini akan sangat lambat. Menggunakan ''.join(h)akan jauh melampaui metode penambahan satu-per-satu Anda.
Martijn Pieters
1
di 'the' python bible (halaman 1400+ halaman itu), di banyak tempat itu memberitahu kita bahwa ini salah untuk dilakukan dan harus dihindari sebisa mungkin. Ini juga merupakan merek dagang yang sangat jelas dari pemula python yang tidak informasi (tidak untuk menghina fungsi ... well) itu mungkin berhasil tetapi Anda akan mendengar "Jangan lakukan ini" dari sekitar 5000 orang untuk melakukannya.
osirisgothra
2

selain itu str.joinyang merupakan cara paling alami, kemungkinannya adalah menggunakan io.StringIOdan menyalahgunakan writelinesuntuk menulis semua elemen sekaligus:

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

cetakan:

abcd

Ketika menggunakan pendekatan ini dengan fungsi generator atau iterable yang bukan a tupleatau a list, itu menyimpan pembuatan daftar sementara yang jointidak mengalokasikan ukuran yang tepat dalam sekali jalan (dan daftar string 1 karakter sangat mahal dari segi memori ).

Jika Anda kekurangan memori dan Anda memiliki objek yang dievaluasi malas sebagai input, pendekatan ini adalah solusi terbaik.

Jean-François Fabre
sumber
0

Anda juga bisa menggunakan operator.concat()seperti ini:

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

Jika Anda menggunakan Python 3, Anda harus menambahkan:

>>> from functools import reduce

sejak builtin reduce()telah dihapus dari Python 3 dan sekarang tinggal di functools.reduce().

Tonechas
sumber