Lebih
Reverse string di Python
Tidak ada built in reverse
fungsi untuk Python's str
objek. Apa adalah cara terbaik untuk menerapkan metode ini?
Jika memasok sangat ringkas jawaban, jelaskan efisiensi. Misalnya, apakah str
objek dikonversi ke objek yang berbeda, dll.
1281
26
Bagaimana tentang:
Ini adalah extended slice sintaks. Ia bekerja dengan melakukan
[mulai:end:step]
- dengan meninggalkan begin dan end off dan menentukan langkah -1, itu membalik string.@Paolo's
s[::-1]
tercepat; pendekatan yang lebih lambat (mungkin lebih mudah dibaca, tapi yang's diperdebatkan) adalah''.bergabung(terbalik(s))
.Pengalaman saya sendiri dengan pertanyaan ini adalah akademik. Namun, jika anda're pro mencari jawaban cepat, gunakan sepotong bahwa langkah-langkah dengan
-1
:atau lebih readably (tapi lebih lambat karena metode pencarian nama dan fakta yang bergabung membentuk daftar ketika diberikan sebuah iterator),
str.bergabung
:atau untuk dibaca dan usabilitas, menempatkan sepotong di fungsi
dan kemudian:
Lagi penjelasan
Jika anda're tertarik pada akademik eksposisi, silahkan terus membaca.
Berikut ini adalah beberapa hal tentang Python's string yang anda harus tahu:
Di Python, string yang berubah. Mengubah string tidak memodifikasi string. Itu menciptakan yang baru.
String yang dapat diiris. Mengiris string memberi anda sebuah string baru dari satu titik dalam string, belakang atau ke depan, ke titik yang lain, dengan diberikan bertahap. Mereka mengambil sepotong notasi atau sepotong objek dalam subskrip:
string[subscript]
Subskrip menciptakan sepotong oleh termasuk usus besar dalam kawat gigi:
Untuk membuat sepotong luar kawat gigi, anda'akan perlu untuk membuat irisan objek:
A dapat dibaca pendekatan:
Sementara
''.bergabung(terbalik('foo'))
dapat dibaca, hal ini membutuhkan memanggil string metode,str.bergabung
, yang lain disebut fungsi, yang dapat menjadi agak relatif lambat. Let's menempatkan ini dalam fungsi - kita'akan datang kembali untuk itu:Paling performant pendekatan:
Jauh lebih cepat adalah dengan menggunakan reverse slice:
Tapi bagaimana kita bisa membuat ini lebih mudah dibaca dan dimengerti oleh seseorang yang kurang akrab dengan irisan atau maksud dari penulis asli? Let's membuat irisan objek di luar subskrip notasi, memberikan nama deskriptif, dan menyebarkannya ke subskrip notasi.
Melaksanakan sebagai Fungsi
Untuk benar-benar menerapkan ini sebagai fungsi, saya pikir itu adalah semantik yang jelas cukup untuk hanya menggunakan nama deskriptif:
Dan penggunaan sederhana:
Apa yang guru anda mungkin ingin:
Jika anda memiliki instruktur, mereka mungkin ingin anda untuk memulai dengan string kosong, dan membangun sebuah string baru dari yang lama. Anda dapat melakukan ini dengan murni sintaks dan literal menggunakan while loop:
Ini adalah secara teoritis buruk karena, ingat, string yang abadi - sehingga setiap waktu di mana terlihat seperti anda're menambahkan karakter ke
new_string
, it's secara teoritis membuat string baru setiap waktu! Namun, CPython tahu bagaimana untuk mengoptimalkan ini dalam kasus-kasus tertentu, dari yang sepele ini kasus adalah salah satu.Praktek Terbaik
Secara teoritis lebih baik adalah untuk mengambil substring dalam sebuah daftar, dan bergabung dengan mereka nanti:
Namun, seperti yang akan kita lihat dalam waktu di bawah ini untuk CPython, ini benar-benar membutuhkan waktu lebih lama, karena CPython dapat mengoptimalkan rangkaian string.
Timing
Berikut ini adalah timing:
CPython mengoptimalkan rangkaian string, sedangkan implementasi lainnya semoga tidak:
Jawaban cepat (TL;DR)
Contoh
Jawaban Rinci
Latar belakang
Jawaban ini disediakan untuk anda, berikut kekhawatiran dari @odigity:
Masalah
Solusi
Perangkap
string.reverse()
string.reverse()
untuk menghindari slice notasi.cetak 'coup_ate_grouping'[-4:] ## => 'ping'
cetak 'coup_ate_grouping'[-4:-1] ## => 'pin'
cetak 'coup_ate_grouping'[-1] ## => 'g'
[-1]
dapat membuang beberapa pengembang offAlasan
Python memiliki keadaan khusus yang harus diperhatikan: string adalah sebuah iterable jenis.
Salah satu alasan untuk mengecualikan
string.reverse()
metode adalah untuk memberikan pengembang python insentif untuk memanfaatkan kekuatan ini keadaan khusus.Dalam istilah sederhana, ini berarti setiap karakter dalam string dapat dengan mudah dioperasikan sebagai bagian dari susunan berurutan dari unsur-unsur, seperti array di bahasa pemrograman yang lain.
Untuk memahami bagaimana hal ini bekerja, meninjau example02 dapat memberikan gambaran yang baik.
Example02
Kesimpulan
The beban kognitif terkait dengan pemahaman bagaimana slice notasi bekerja di python mungkin memang terlalu banyak untuk beberapa pengguna dan pengembang yang tidak ingin menginvestasikan banyak waktu dalam belajar bahasa.
Namun demikian, sekali-prinsip dasar yang dipahami, kekuatan dari pendekatan ini lebih dari fixed string manipulasi metode ini dapat cukup menguntungkan.
Bagi mereka yang berpikir sebaliknya, ada alternatif pendekatan, seperti lambda fungsi, iterator, atau sederhana satu-off deklarasi fungsi.
Jika diinginkan, pengembang dapat melaksanakan sendiri string.reverse() metode, namun itu lebih baik untuk memahami alasan di balik ini aspek python.
Lihat juga
Yang lebih membingungkan cara untuk melihat itu akan menjadi:
Dalam bahasa inggris [-1::-1] berbunyi sebagai:
Ada jawaban hanya benar jika Unicode Pengubah / grafem cluster diabaikan. I'll berurusan dengan itu nanti, tapi pertama-tama melihat pada kecepatan beberapa pembalikan algoritma:
[![enter image description here][1]][1]
[![enter image description here][2]][2]
Anda dapat melihat bahwa waktu untuk daftar pemahaman (
dibalik = string[::-1]
) dalam semua kasus jauh terendah (bahkan setelah saya memperbaiki typo).String Pembalikan
Jika anda benar-benar ingin membalikkan string dalam arti umum, itu adalah CARA yang lebih rumit. Misalnya, mengambil string berikut (coklat jari yang menunjuk ke kiri, kuning jari menunjuk ke atas). Mereka adalah dua grafem, tapi 3 kode unicode poin. Tambahan satu adalah skin modifier.
Tapi jika anda terbalik dengan apa yang diberikan metode, anda mendapatkan coklat jari menunjuk ke atas, kuning jari yang menunjuk ke kiri. Alasan untuk ini adalah bahwa "brown" warna pengubah masih di tengah dan akan diterapkan untuk apa pun sebelum itu. Jadi kita memiliki
dan
Unicode Grapheme Cluster adalah sedikit lebih rumit dari sekedar pengubah kode poin. Untungnya, ada sebuah perpustakaan untuk penanganan grafem:
dan oleh karena itu jawaban yang benar akan
yang juga adalah jauh paling lambat:
Kode
1. menggunakan slice notasi
2. menggunakan dibalik() fungsi
3. menggunakan rekursi
Ini juga merupakan cara yang menarik:
atau serupa:
Lain lagi 'eksotik' cara menggunakan byterarray yang mendukung .reverse()
akan menghasilkan:
Reverse string di python tanpa menggunakan dibalik() atau [::-1]
Metode Recursive:
contoh:
Di sini adalah tidak mewah satu:
Semua solusi di atas adalah sempurna tetapi jika kita mencoba untuk membalikkan string dengan menggunakan loop for di python akan menjadi sedikit rumit, jadi di sini adalah bagaimana kita bisa mengembalikan string dengan menggunakan for loop
Saya berharap yang satu ini akan sangat membantu bagi seseorang.
Thats cara saya:
Ini bekerja dengan perulangan melalui sebuah string dan menetapkan nilai-nilai dalam urutan terbalik dengan string lain.
Ada banyak cara untuk membalikkan string tapi saya juga membuat satu sama lain hanya untuk bersenang-senang. Saya pikir pendekatan ini tidak seburuk itu.
Kelas ini menggunakan python sihir fungsi untuk membalikkan string:
Output
Referensi
Berikut adalah salah satu tanpa
[::-1]
atauterbalik
(untuk tujuan pembelajaran):anda dapat menggunakan
+=
untuk menggabungkan string tapijoin()
lebih cepat.Ini adalah sederhana dan bermakna fungsi sebaliknya, mudah untuk memahami dan kode