Ini adalah sintaks slice yang diperpanjang . Ia bekerja dengan melakukan [begin:end:step]- dengan meninggalkan mulai dan berakhir dan menentukan langkah -1, itu membalikkan string.
Itu tidak bekerja untuk utf8 sekalipun .. Saya perlu melakukan ini juga b = a.decode('utf8')[::-1].encode('utf8')tetapi terima kasih untuk arah yang benar!
Ricky Levi
14
@ RickyLevi Jika .decode('utf8')diperlukan, itu berarti atidak mengandung objek string, melainkan byte.
Shiplu Mokaddim
256
@ Paolo's s[::-1]adalah yang tercepat; pendekatan yang lebih lambat (mungkin lebih mudah dibaca, tapi itu bisa diperdebatkan) ''.join(reversed(s)).
Dan komentar cepat untuk mengatakan apa yang dilakukannya akan menjelaskan lebih baik daripada menggunakan versi yang lebih lambat ini!
tburrows13
4
lebih lambat karena joinharus membuat daftar untuk mendapatkan ukuran. ''.join(list(reversed(s)))mungkin sedikit lebih cepat.
Jean-François Fabre
Apakah Anda memiliki info mengapa [:: - 1] paling cepat? Saya ingin menyelam lebih dalam.
Tanner
@Tanner [:: - 1] adalah yang tercepat karena tidak memanggil fungsi eksternal, melainkan menggunakan slicing, yang sangat dioptimalkan dengan python. '' .join (daftar (terbalik)) membuat 3 panggilan fungsi.
HD1
217
Apa cara terbaik menerapkan fungsi terbalik untuk string?
Pengalaman saya sendiri dengan pertanyaan ini bersifat akademis. Namun, jika Anda seorang pro mencari jawaban cepat, gunakan irisan yang langkah oleh -1:
>>>'a string'[::-1]'gnirts a'
atau lebih readably (tapi lebih lambat karena pencarian nama metode dan fakta bahwa bergabung bentuk daftar ketika diberi iterator), str.join:
>>>''.join(reversed('a string'))'gnirts a'
atau agar mudah dibaca dan digunakan kembali, letakkan slice dalam suatu fungsi
Jika Anda tertarik pada eksposisi akademik, silakan terus membaca.
Tidak ada fungsi terbalik bawaan dalam objek str Python.
Berikut adalah beberapa hal tentang string Python yang harus Anda ketahui:
Dalam Python, string tidak dapat diubah . Mengubah string tidak mengubah string. Itu menciptakan yang baru.
String dapat diiris. Mengiris string memberi Anda string baru dari satu titik di string, mundur atau maju, ke titik lain, dengan penambahan yang diberikan. Mereka mengambil notasi irisan atau objek irisan dalam subskrip:
string[subscript]
Subskrip membuat irisan dengan memasukkan titik dua di dalam kurung:
string[start:stop:step]
Untuk membuat irisan di luar kawat gigi, Anda harus membuat objek irisan:
Meskipun ''.join(reversed('foo'))dapat dibaca, ia membutuhkan pemanggilan metode string str.join, pada fungsi lain yang dipanggil, yang bisa agak lambat. Mari kita letakkan ini di fungsi - kita akan kembali ke sana:
Tetapi bagaimana kita bisa membuat ini lebih mudah dibaca dan dimengerti oleh seseorang yang kurang akrab dengan irisan atau maksud dari penulis asli? Mari kita membuat objek irisan di luar notasi subskrip, berikan nama deskriptif, dan berikan ke notifikasi subskrip.
Jika Anda memiliki instruktur, mereka mungkin ingin Anda memulai dengan string kosong, dan membangun string baru dari yang lama. Anda bisa melakukan ini dengan sintaks dan literal murni menggunakan loop sementara:
def reverse_a_string_slowly(a_string):
new_string =''
index = len(a_string)while index:
index -=1# index = index - 1
new_string += a_string[index]# new_string = new_string + characterreturn new_string
Ini secara teori buruk karena, ingat, string tidak dapat diubah - jadi setiap kali sepertinya Anda menambahkan karakter ke karakter Andanew_string , string secara teoritis membuat string baru setiap saat! Namun, CPython tahu cara mengoptimalkan ini dalam kasus-kasus tertentu, salah satunya adalah sepele.
Praktek terbaik
Secara teoritis lebih baik adalah mengumpulkan substring Anda dalam daftar, dan bergabunglah nanti:
def reverse_a_string_more_slowly(a_string):
new_strings =[]
index = len(a_string)while index:
index -=1
new_strings.append(a_string[index])return''.join(new_strings)
Namun, seperti yang akan kita lihat pada timing di bawah untuk CPython, ini sebenarnya memakan waktu lebih lama, karena CPython dapat mengoptimalkan penggabungan string.
CPython mengoptimalkan penggabungan string, sedangkan implementasi lainnya mungkin tidak :
... jangan bergantung pada implementasi efisien dari rangkaian string in-place CPython untuk pernyataan dalam bentuk a = = b atau a = a + b. Optimasi ini rapuh bahkan dalam CPython (hanya berfungsi untuk beberapa jenis) dan tidak ada sama sekali dalam implementasi yang tidak menggunakan penghitungan ulang. Di bagian peka kinerja yang sensitif, formulir '' .join () harus digunakan sebagai gantinya. Ini akan memastikan bahwa rangkaian terjadi dalam waktu linier di berbagai implementasi.
Saya suka jawaban ini, penjelasan tentang optimisasi, keterbacaan vs optimisasi, tips tentang apa yang diinginkan guru. Saya tidak yakin tentang bagian praktek terbaik dengan whiledan decrementing indeks, meskipun mungkin ini kurang dibaca: for i in range(len(a_string)-1, -1, -1): . Yang terpenting, saya suka contoh string yang Anda pilih adalah satu kasus di mana Anda tidak perlu membalikkannya, dan tidak akan dapat memberi tahu jika Anda punya :)
Jawaban ini diberikan untuk mengatasi masalah berikut dari @odigity:
Wow. Pada awalnya saya merasa ngeri dengan solusi yang diusulkan Paolo, tetapi itu membuat saya merasa ngeri ketika membaca komentar pertama: "Itu sangat pythonic. Kerja bagus!" Saya sangat terganggu bahwa komunitas yang begitu terang berpikir menggunakan metode samar untuk sesuatu yang begitu mendasar adalah ide yang bagus. Mengapa bukan hanya s.reverse ()?
Masalah
Konteks
Python 2.x
Python 3.x
Skenario:
Pengembang ingin mengubah string
Transformasi adalah membalik urutan semua karakter
Pengembang mungkin mengharapkan sesuatu seperti string.reverse()
Solusi idiomatik asli (alias " pythonic ") mungkin tidak dapat dibaca oleh pengembang yang lebih baru
Pengembang mungkin tergoda untuk mengimplementasikan versinya sendiri string.reverse() untuk menghindari notasi slice.
Keluaran notasi irisan mungkin kontra-intuitif dalam beberapa kasus:
lihat misalnya, example02
print 'coup_ate_grouping'[-4:] ## => 'ping'
dibandingkan dengan
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
dibandingkan dengan
print 'coup_ate_grouping'[-1] ## => 'g'
perbedaan hasil pengindeksan [-1]dapat membuat beberapa pengembang tidak aktif
Alasan
Python memiliki keadaan khusus yang harus diperhatikan: string adalah tipe yang dapat diubah .
Satu alasan untuk mengecualikan string.reverse()metode adalah untuk memberikan insentif pengembang python untuk memanfaatkan kekuatan keadaan khusus ini.
Dalam istilah yang disederhanakan, ini berarti setiap karakter individu dalam string dapat dengan mudah dioperasikan sebagai bagian dari susunan elemen berurutan, seperti halnya array dalam bahasa pemrograman lain.
Untuk memahami cara kerjanya, meninjau example02 dapat memberikan tinjauan yang baik.
Beban kognitif yang terkait dengan memahami bagaimana notasi slice bekerja dengan python memang mungkin terlalu banyak untuk beberapa pengguna dan pengembang yang tidak ingin menginvestasikan banyak waktu dalam mempelajari bahasa.
Namun demikian, begitu prinsip-prinsip dasar dipahami, kekuatan pendekatan ini atas metode manipulasi string tetap bisa sangat menguntungkan.
Bagi mereka yang berpikir sebaliknya, ada pendekatan alternatif, seperti fungsi lambda, iterator, atau deklarasi fungsi satu kali sederhana.
Jika diinginkan, pengembang dapat mengimplementasikan metode string.reverse () miliknya, namun ada baiknya memahami alasan di balik aspek python ini.
Jawaban yang ada hanya benar jika Unicode Modifiers / cluster grapheme diabaikan. Saya akan membahasnya nanti, tetapi pertama-tama kita lihat kecepatan beberapa algoritma pembalikan:
Anda dapat melihat bahwa waktu untuk pemahaman daftar (reversed = string[::-1] ) dalam semua kasus adalah yang terendah (bahkan setelah memperbaiki kesalahan ketik saya).
Tetapi jika Anda membalikkannya dengan salah satu metode yang diberikan, Anda mendapatkan jari cokelat mengarah ke atas , jari kuning menunjuk ke kiri . Alasan untuk ini adalah bahwa pengubah warna "coklat" masih di tengah dan diterapkan pada apa pun yang ada sebelum itu. Jadi kita punya
Harus menonton solusi rekursi, jika panjangnya string yang sesuai Anda akan mengalami RecursionError: maximum recursion depth exceeded while calling a Python object. Contoh:rev_string("abcdef"*1000)
Saya mengeklik upvote, karena saya suka ungkapan lambda ini. Sayangnya, ini adalah solusi yang paling tidak efisien dari semua yang tercantum di atas (test: Gist palindrome.py )
oski86
2
original ="string"
rev_index = original[::-1]
rev_func = list(reversed(list(original)))#nsfwprint(original)print(rev_index)print(''.join(rev_func))
Meskipun kode ini dapat menjawab pertanyaan, lebih baik untuk menjelaskan bagaimana menyelesaikan masalah dan memberikan kode sebagai contoh atau referensi. Jawaban khusus kode bisa membingungkan dan kurang konteks.
Robert Columbia
1
def reverse_string(string):
length = len(string)
temp =''for i in range(length):
temp += string[length - i -1]return temp
print(reverse_string('foo'))#prints "oof"
Ini bekerja dengan mengulang melalui string dan menetapkan nilainya dalam urutan terbalik ke string lain.
Semua solusi di atas adalah sempurna tetapi jika kita mencoba untuk membalik sebuah string menggunakan untuk loop dengan python akan menjadi sedikit rumit jadi di sini adalah bagaimana kita dapat membalikkan string menggunakan untuk loop
string ="hello,world"for i in range(-1,-len(string)-1,-1):print(string[i],end=(" "))
Ada banyak cara untuk membalik string tetapi saya juga membuat yang lain hanya untuk bersenang-senang. Saya pikir pendekatan ini tidak seburuk itu.
def reverse(_str):
list_char = list(_str)# Create a hypothetical list. because string is immutablefor i in range(len(list_char)/2):# just t(n/2) to reverse a big string
list_char[i], list_char[-i -1]= list_char[-i -1], list_char[i]return''.join(list_char)print(reverse("Ehsan"))
Dengan python 3 Anda dapat membalikkan string di tempat yang berarti tidak akan ditugaskan ke variabel lain. Pertama, Anda harus mengubah string menjadi daftar dan kemudian memanfaatkan reverse()fungsi.
Meskipun ini mungkin menjawab pertanyaan penulis, tidak ada beberapa kata yang menjelaskan dan / atau tautan ke dokumentasi. Cuplikan kode mentah tidak sangat membantu tanpa frasa di sekitarnya. Anda juga dapat menemukan cara menulis jawaban yang baik sangat membantu. Harap edit jawaban Anda.
berteriak
-3
Ini sederhananya:
cetak "loremipsum" [- 1 :: - 1]
dan beberapa secara logis:
def str_reverse_fun():
empty_list =[]
new_str ='loremipsum'
index = len(new_str)while index:
index = index -1
empty_list.append(new_str[index])return''.join(empty_list)print str_reverse_fun()
Mencetak string secara terbalik adalah sesuatu yang berbeda dari membalikkan string
Martin Thoma
-5
Tentu, dengan Python Anda dapat melakukan hal-hal 1-baris yang sangat mewah. :)
Inilah solusi sederhana, serba bisa yang bisa digunakan dalam bahasa pemrograman apa pun.
def reverse_string(phrase):
reversed =""
length = len(phrase)for i in range(length):
reversed += phrase[length-1-i]return reversed
phrase = raw_input("Provide a string: ")print reverse_string(phrase)
Anda dapat menggunakan fungsi terbalik dengan daftar komprehensif. Tapi saya tidak mengerti mengapa metode ini dihilangkan dengan python 3, tidak perlu.
Jawaban:
Bagaimana tentang:
Ini adalah sintaks slice yang diperpanjang . Ia bekerja dengan melakukan
[begin:end:step]
- dengan meninggalkan mulai dan berakhir dan menentukan langkah -1, itu membalikkan string.sumber
b = a.decode('utf8')[::-1].encode('utf8')
tetapi terima kasih untuk arah yang benar!.decode('utf8')
diperlukan, itu berartia
tidak mengandung objek string, melainkan byte.@ Paolo's
s[::-1]
adalah yang tercepat; pendekatan yang lebih lambat (mungkin lebih mudah dibaca, tapi itu bisa diperdebatkan)''.join(reversed(s))
.sumber
join
harus membuat daftar untuk mendapatkan ukuran.''.join(list(reversed(s)))
mungkin sedikit lebih cepat.Pengalaman saya sendiri dengan pertanyaan ini bersifat akademis. Namun, jika Anda seorang pro mencari jawaban cepat, gunakan irisan yang langkah oleh
-1
:atau lebih readably (tapi lebih lambat karena pencarian nama metode dan fakta bahwa bergabung bentuk daftar ketika diberi iterator),
str.join
:atau agar mudah dibaca dan digunakan kembali, letakkan slice dalam suatu fungsi
lalu:
Penjelasan yang lebih panjang
Jika Anda tertarik pada eksposisi akademik, silakan terus membaca.
Berikut adalah beberapa hal tentang string Python yang harus Anda ketahui:
Dalam Python, string tidak dapat diubah . Mengubah string tidak mengubah string. Itu menciptakan yang baru.
String dapat diiris. Mengiris string memberi Anda string baru dari satu titik di string, mundur atau maju, ke titik lain, dengan penambahan yang diberikan. Mereka mengambil notasi irisan atau objek irisan dalam subskrip:
Subskrip membuat irisan dengan memasukkan titik dua di dalam kurung:
Untuk membuat irisan di luar kawat gigi, Anda harus membuat objek irisan:
Pendekatan yang mudah dibaca:
Meskipun
''.join(reversed('foo'))
dapat dibaca, ia membutuhkan pemanggilan metode stringstr.join
, pada fungsi lain yang dipanggil, yang bisa agak lambat. Mari kita letakkan ini di fungsi - kita akan kembali ke sana:Kebanyakan pendekatan berkinerja:
Jauh lebih cepat menggunakan slice terbalik:
Tetapi bagaimana kita bisa membuat ini lebih mudah dibaca dan dimengerti oleh seseorang yang kurang akrab dengan irisan atau maksud dari penulis asli? Mari kita membuat objek irisan di luar notasi subskrip, berikan nama deskriptif, dan berikan ke notifikasi subskrip.
Diimplementasikan sebagai Fungsi
Untuk benar-benar mengimplementasikan ini sebagai fungsi, saya pikir secara semantik cukup jelas untuk hanya menggunakan nama deskriptif:
Dan penggunaannya adalah:
Apa yang mungkin diinginkan oleh guru Anda:
Jika Anda memiliki instruktur, mereka mungkin ingin Anda memulai dengan string kosong, dan membangun string baru dari yang lama. Anda bisa melakukan ini dengan sintaks dan literal murni menggunakan loop sementara:
Ini secara teori buruk karena, ingat, string tidak dapat diubah - jadi setiap kali sepertinya Anda menambahkan karakter ke karakter Anda
new_string
, string secara teoritis membuat string baru setiap saat! Namun, CPython tahu cara mengoptimalkan ini dalam kasus-kasus tertentu, salah satunya adalah sepele.Praktek terbaik
Secara teoritis lebih baik adalah mengumpulkan substring Anda dalam daftar, dan bergabunglah nanti:
Namun, seperti yang akan kita lihat pada timing di bawah untuk CPython, ini sebenarnya memakan waktu lebih lama, karena CPython dapat mengoptimalkan penggabungan string.
Pengaturan waktu
Berikut ini waktunya:
CPython mengoptimalkan penggabungan string, sedangkan implementasi lainnya mungkin tidak :
sumber
while
dan decrementing indeks, meskipun mungkin ini kurang dibaca:for i in range(len(a_string)-1, -1, -1):
. Yang terpenting, saya suka contoh string yang Anda pilih adalah satu kasus di mana Anda tidak perlu membalikkannya, dan tidak akan dapat memberi tahu jika Anda punya :)Jawaban Cepat (TL; DR)
Contoh
Jawaban terperinci
Latar Belakang
Jawaban ini diberikan untuk mengatasi masalah berikut dari @odigity:
Masalah
Larutan
Perangkap
string.reverse()
string.reverse()
untuk menghindari notasi slice.print 'coup_ate_grouping'[-4:] ## => 'ping'
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
print 'coup_ate_grouping'[-1] ## => 'g'
[-1]
dapat membuat beberapa pengembang tidak aktifAlasan
Python memiliki keadaan khusus yang harus diperhatikan: string adalah tipe yang dapat diubah .
Satu alasan untuk mengecualikan
string.reverse()
metode adalah untuk memberikan insentif pengembang python untuk memanfaatkan kekuatan keadaan khusus ini.Dalam istilah yang disederhanakan, ini berarti setiap karakter individu dalam string dapat dengan mudah dioperasikan sebagai bagian dari susunan elemen berurutan, seperti halnya array dalam bahasa pemrograman lain.
Untuk memahami cara kerjanya, meninjau example02 dapat memberikan tinjauan yang baik.
Contoh02
Kesimpulan
Beban kognitif yang terkait dengan memahami bagaimana notasi slice bekerja dengan python memang mungkin terlalu banyak untuk beberapa pengguna dan pengembang yang tidak ingin menginvestasikan banyak waktu dalam mempelajari bahasa.
Namun demikian, begitu prinsip-prinsip dasar dipahami, kekuatan pendekatan ini atas metode manipulasi string tetap bisa sangat menguntungkan.
Bagi mereka yang berpikir sebaliknya, ada pendekatan alternatif, seperti fungsi lambda, iterator, atau deklarasi fungsi satu kali sederhana.
Jika diinginkan, pengembang dapat mengimplementasikan metode string.reverse () miliknya, namun ada baiknya memahami alasan di balik aspek python ini.
Lihat juga
sumber
Jawaban yang ada hanya benar jika Unicode Modifiers / cluster grapheme diabaikan. Saya akan membahasnya nanti, tetapi pertama-tama kita lihat kecepatan beberapa algoritma pembalikan:
Anda dapat melihat bahwa waktu untuk pemahaman daftar (
reversed = string[::-1]
) dalam semua kasus adalah yang terendah (bahkan setelah memperbaiki kesalahan ketik saya).String Reversal
Jika Anda benar-benar ingin membalik string dalam akal sehat, itu WAY lebih rumit. Misalnya, ambil string berikut ( jari coklat menunjuk ke kiri , jari kuning menunjuk ke atas ). Itu adalah dua grapheme, tetapi 3 poin kode unicode. Yang tambahan adalah pengubah kulit .
Tetapi jika Anda membalikkannya dengan salah satu metode yang diberikan, Anda mendapatkan jari cokelat mengarah ke atas , jari kuning menunjuk ke kiri . Alasan untuk ini adalah bahwa pengubah warna "coklat" masih di tengah dan diterapkan pada apa pun yang ada sebelum itu. Jadi kita punya
dan
Unicode Grapheme Clusters sedikit lebih rumit dari sekedar titik kode pengubah. Untungnya, ada perpustakaan untuk menangani grafik :
dan karenanya jawaban yang benar adalah
yang juga paling lambat:
Kode
sumber
1. menggunakan notasi slice
2. menggunakan fungsi terbalik ()
3. menggunakan rekursi
sumber
RecursionError: maximum recursion depth exceeded while calling a Python object
. Contoh:rev_string("abcdef"*1000)
Cara yang membingungkan untuk melihatnya adalah:
Dalam bahasa Inggris [-1 :: - 1] dibaca sebagai:
sumber
-1
masih dibutuhkan, meskipun.Membalikkan string dalam python tanpa menggunakan terbalik () atau [:: - 1]
sumber
Ini juga cara yang menarik:
atau serupa:
Cara lain yang lebih 'eksotis' menggunakan byterarray yang mendukung .reverse ()
akan menghasilkan:
sumber
sumber
sumber
Ini bekerja dengan mengulang melalui string dan menetapkan nilainya dalam urutan terbalik ke string lain.
sumber
Inilah yang tidak mewah:
sumber
Ini satu tanpa
[::-1]
ataureversed
(untuk tujuan belajar):Anda dapat menggunakan
+=
untuk menggabungkan string tetapijoin()
lebih cepat.sumber
Metode rekursif:
contoh:
sumber
Semua solusi di atas adalah sempurna tetapi jika kita mencoba untuk membalik sebuah string menggunakan untuk loop dengan python akan menjadi sedikit rumit jadi di sini adalah bagaimana kita dapat membalikkan string menggunakan untuk loop
Saya harap yang ini akan membantu seseorang.
sumber
Itulah cara saya:
sumber
Ada banyak cara untuk membalik string tetapi saya juga membuat yang lain hanya untuk bersenang-senang. Saya pikir pendekatan ini tidak seburuk itu.
sumber
Kelas ini menggunakan fungsi sulap python untuk membalikkan string:
Keluaran
Referensi
sumber
Dengan python 3 Anda dapat membalikkan string di tempat yang berarti tidak akan ditugaskan ke variabel lain. Pertama, Anda harus mengubah string menjadi daftar dan kemudian memanfaatkan
reverse()
fungsi.https://docs.python.org/3/tutorial/datastructures.html
sumber
Ini adalah fungsi terbalik yang sederhana dan bermakna, mudah dimengerti dan kode
sumber
Ini sederhananya:
cetak "loremipsum" [- 1 :: - 1]
dan beberapa secara logis:
keluaran:
muspimerol
sumber
Membalikkan string tanpa sihir python.
sumber
Tentu, dengan Python Anda dapat melakukan hal-hal 1-baris yang sangat mewah. :)
Inilah solusi sederhana, serba bisa yang bisa digunakan dalam bahasa pemrograman apa pun.
sumber
OUTPUT:
sumber
Anda dapat menggunakan fungsi terbalik dengan daftar komprehensif. Tapi saya tidak mengerti mengapa metode ini dihilangkan dengan python 3, tidak perlu.
sumber
.join
atau sesuatu untuk membuatnya menjadi jawaban yang valid[c for c in string]
sama saja denganlist(string)
.