Apa cara paling pythonic untuk menyatukan dua string?
Sebagai contoh:
Memasukkan:
u = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
l = 'abcdefghijklmnopqrstuvwxyz'
Keluaran:
'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
python
string
python-2.7
python-3.x
Brandon Deo
sumber
sumber
Jawaban:
Bagi saya, cara paling pythonic * adalah yang berikut ini yang cukup banyak melakukan hal yang sama tetapi menggunakan
+
operator untuk menggabungkan karakter individu di setiap string:Ini juga lebih cepat daripada menggunakan dua
join()
panggilan:Ada pendekatan yang lebih cepat, tetapi mereka sering mengaburkan kode.
Catatan: Jika kedua string input tidak memiliki panjang yang sama maka string yang lebih panjang akan dipotong karena
zip
berhenti melakukan iterasi di ujung string yang lebih pendek. Dalam kasus ini, Andazip
harus menggunakanzip_longest
(izip_longest
dalam Python 2) dariitertools
modul untuk memastikan bahwa kedua string habis sepenuhnya.* Untuk mengambil kutipan dari Zen of Python : Jumlah keterbacaan .
Pythonic = keterbacaan bagi saya;
i + j
hanya diurai secara visual dengan lebih mudah, setidaknya untuk mata saya.sumber
"".join([i + j for i, j in zip(l1, l2)])
dan itu pasti akan menjadi yang tercepat"".join(map("".join, zip(l1, l2)))
bahkan lebih cepat, meski belum tentu lebih pythonic.Alternatif Lebih Cepat
Cara lain:
Keluaran:
Mempercepat
Sepertinya lebih cepat:
daripada solusi tercepat sejauh ini:
Juga untuk string yang lebih besar:
Python 3.5.1.
Variasi untuk string dengan panjang berbeda
Yang lebih pendek menentukan panjang (
zip()
setara)Keluaran:
Yang lebih panjang menentukan panjang (
itertools.zip_longest(fillvalue='')
setara)Keluaran:
sumber
Dengan
join()
danzip()
.sumber
''.join(itertools.chain.from_iterable(zip(u, l)))
zip
berhenti ketika daftar yang lebih pendek telah diulangi sepenuhnya.itertools.zip_longest
dapat digunakan jika menjadi masalah.Pada Python 2, dengan jauh cara yang lebih cepat untuk melakukan hal-hal, di ~ 3x kecepatan daftar mengiris untuk string kecil dan ~ 30x untuk yang panjang, adalah
Ini tidak akan berfungsi pada Python 3. Anda bisa menerapkan sesuatu seperti
tetapi saat itu Anda sudah kehilangan keuntungan atas pemotongan daftar untuk string kecil (kecepatannya masih 20x untuk string panjang) dan ini bahkan belum berfungsi untuk karakter non-ASCII.
FWIW, jika Anda sedang melakukan hal ini pada string besar dan perlu setiap siklus, dan untuk beberapa alasan harus menggunakan Python string ... berikut adalah cara untuk melakukannya:
Casing khusus, casing umum dari jenis yang lebih kecil juga akan membantu. FWIW, ini hanya 3x kecepatan pemotongan daftar untuk string panjang dan faktor 4 hingga 5 lebih lambat untuk string kecil.
Bagaimanapun saya lebih suka
join
solusinya, tetapi karena pengaturan waktu disebutkan di tempat lain, saya pikir saya sebaiknya bergabung.sumber
Jika Anda menginginkan cara tercepat, Anda dapat menggabungkan itertools dengan
operator.add
:Tapi menggabungkan
izip
danchain.from_iterable
lebih cepat lagiAda juga perbedaan substansial antara
chain(*
danchain.from_iterable(...
.Tidak ada yang namanya generator dengan join, melewatkan satu akan selalu lebih lambat karena python pertama-tama akan membuat daftar menggunakan konten karena ia melakukan dua melewati data, satu untuk mengetahui ukuran yang dibutuhkan dan satu untuk benar-benar melakukannya gabungan yang tidak mungkin dilakukan menggunakan generator:
join.h :
Juga jika Anda memiliki panjang string yang berbeda dan Anda tidak ingin kehilangan data, Anda dapat menggunakan izip_longest :
Untuk python 3 itu disebut
zip_longest
Tetapi untuk python2, saran veedrac sejauh ini adalah yang tercepat:
sumber
list
?? tidak dibutuhkan"".join(list(...))
memberi saya 6.715280318699769 dan timeit"".join(starmap(...))
memberi saya 6.46332361384313"".join(list(starmap(add, izip(l1,l2))))
lebih lambat dari"".join(starmap(add, izip(l1,l2)))
. Saya menjalankan tes di mesin saya di python 2.7.11 dan di python 3.5.1 bahkan di konsol virtual www.python.org dengan python 3.4.3 dan semua mengatakan hal yang sama dan saya menjalankannya beberapa kali dan selalu samaAnda juga bisa melakukan ini dengan menggunakan
map
danoperator.add
:Keluaran :
Apa yang dilakukan map adalah mengambil setiap elemen dari iterable pertama
u
dan elemen pertama dari iterable kedual
dan menerapkan fungsi yang disediakan sebagai argumen pertamaadd
. Kemudian bergabunglah bergabung saja dengan mereka.sumber
Jawaban Jim bagus, tapi inilah pilihan favorit saya, jika Anda tidak keberatan dengan beberapa impor:
sumber
Banyak dari saran ini mengasumsikan string memiliki panjang yang sama. Mungkin itu mencakup semua kasus penggunaan yang wajar, tetapi setidaknya bagi saya tampaknya Anda mungkin ingin mengakomodasi string dengan panjang yang berbeda juga. Atau apakah saya satu-satunya yang berpikir mesh harus bekerja seperti ini:
Salah satu cara untuk melakukannya adalah sebagai berikut:
sumber
Saya suka menggunakan dua
for
s, nama variabel dapat memberikan petunjuk / pengingat tentang apa yang sedang terjadi:sumber
Hanya untuk menambahkan pendekatan lain yang lebih mendasar:
sumber
Terasa agak tidak pythonic untuk tidak mempertimbangkan jawaban pemahaman daftar ganda di sini, untuk menangani string n dengan usaha O (1):
di mana
all_strings
daftar string yang ingin Anda sisipkan. Dalam kasus Andaall_strings = [u, l]
,. Contoh penggunaan lengkap akan terlihat seperti ini:Seperti banyak jawaban, tercepat? Mungkin tidak, tapi sederhana dan fleksibel. Juga, tanpa terlalu banyak kerumitan tambahan, ini sedikit lebih cepat daripada jawaban yang diterima (secara umum, penambahan string agak lambat di python):
sumber
Berpotensi lebih cepat dan lebih pendek dari solusi terdepan saat ini:
Strategi yang bijak dengan kecepatan adalah melakukan sebanyak mungkin pada level C. Zip_longest () yang sama untuk string yang tidak rata dan itu akan keluar dari modul yang sama dengan chain () jadi tidak bisa memberi saya terlalu banyak poin di sana!
Solusi lain yang saya temukan selama ini:
sumber
Anda bisa menggunakan 1
iteration_utilities.roundrobin
atau
ManyIterables
kelas dari paket yang sama:1 ini adalah dari pihak ketiga perpustakaan saya telah menulis:
iteration_utilities
.sumber
Saya akan menggunakan zip () untuk mendapatkan cara yang mudah dan mudah dibaca:
sumber