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.
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)exceptAttributeError:import string
b = string.join(a,'')
@ 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 ..
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().
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.
Jawaban:
Gunakan
join
metode string kosong untuk menggabungkan semua string bersama-sama dengan string kosong di antaranya, seperti:sumber
' '.join(list)
dengan spasi di antara tanda kutip"".join(['a','b','c'])
berartiJoin 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"
.Ini berfungsi dalam banyak bahasa populer seperti JavaScript dan Ruby, mengapa tidak menggunakan Python?
Cukup aneh, dengan Python
join
metode ini ada distr
kelas:Mengapa
join
bukan metode padalist
objek 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, jadistr.join(list)
metode ini berarti: bergabung dengan daftar ke string baru menggunakanstr
sebagai pemisah (dalam hal inistr
adalah 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.
sumber
string.join()
dengan kebanyakan koleksi yang memilikijoin()
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 dalamjoin()
metode ini.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:String
b
akan menjadi'abcd'
.sumber
Ini mungkin cara tercepat:
sumber
''.join(['a','b','c'])
map(ord,a)
tidak perlu, tetapi bergabung dengan kebutuhanmap(chr,a)
. Ini patokan pastebin.com/1sKFm8ma''.join()
jauh lebih mudah dibaca.Fungsi pengurangan juga berfungsi
sumber
(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 melakukannyaoperator.add(*h)
, karenaapply
telah secara resmi ditinggalkan dalam Python untuk sintaks panggilan yang diperpanjang (alias en.wikipedia.org/wiki/Variadic_function )Jika daftar berisi nomor, Anda dapat menggunakan
map()
denganjoin()
.Misalnya:
sumber
''.join([str(i) for i in arr])
sumber
''.join(h)
akan jauh melampaui metode penambahan satu-per-satu Anda.selain itu
str.join
yang merupakan cara paling alami, kemungkinannya adalah menggunakanio.StringIO
dan menyalahgunakanwritelines
untuk menulis semua elemen sekaligus:cetakan:
Ketika menggunakan pendekatan ini dengan fungsi generator atau iterable yang bukan a
tuple
atau alist
, itu menyimpan pembuatan daftar sementara yangjoin
tidak 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.
sumber
Anda juga bisa menggunakan
operator.concat()
seperti ini:Jika Anda menggunakan Python 3, Anda harus menambahkan:
sejak builtin
reduce()
telah dihapus dari Python 3 dan sekarang tinggal difunctools.reduce()
.sumber