מחרוזת Python אין לה פונקציה מובנית להיפוך (). אך, קיימות שיטות שונות להיפוך מחרוזת בפייתון.
1. כיצד להפוך מחרוזת בפייתון?
חלק מהדרכים הנפוצות להיפוך מחרוזת הם:
- שימוש ב Slicing ליצירת עותק הפוך של המחרוזת.
- שימוש בלולאת for והוספת תווים בסדר הפוך
- שימוש בלולאת while לעבור על תווי המחרוזת בסדר הפוך ולהוסיף אותם
- שימוש בפונקציית join() עם הפונקציה reversed() iterator
- יצירת רשימה מהמחרוזת ואז לקרוא לפונקציית
reverse()
שלה - שימוש ברקורסיה
1.1) היפוך מחרוזת Python באמצעות Slicing
def reverse_slicing(s):
return s[::-1]
input_str = 'ABç∂EF'
if __name__ == "__main__":
print('Reverse String using slicing =', reverse_slicing(input_str))
אם תריץ את סקריפט הפייתון שלמעלה, הפלט יהיה:
Reverse String using slicing = FE∂çBA
1.2) הפיכת מחרוזת באמצעות לולאת For
def reverse_for_loop(s):
s1 = ''
for c in s:
s1 = c + s1 # appending chars in reverse order
return s1
input_str = 'ABç∂EF'
if __name__ == "__main__":
print('Reverse String using for loop =', reverse_for_loop(input_str))
פלט: הפיכת מחרוזת באמצעות לולאת for = FE∂çBA
1.3) הפיכת מחרוזת באמצעות לולאת While
def reverse_while_loop(s):
s1 = ''
length = len(s) - 1
while length >= 0:
s1 = s1 + s[length]
length = length - 1
return s1
input_str = 'ABç∂EF'
if __name__ == "__main__":
print('Reverse String using while loop =', reverse_while_loop(input_str))
1.4) הפיכת מחרוזת באמצעות join() ו־reversed()
def reverse_join_reversed_iter(s):
s1 = ''.join(reversed(s))
return s1
1.5) הפיכת מחרוזת בפייתון באמצעות reverse() של רשימה
def reverse_list(s):
temp_list = list(s)
temp_list.reverse()
return ''.join(temp_list)
1.6) הפיכת מחרוזת בפייתון באמצעות רקורסיה
def reverse_recursion(s):
if len(s) == 0:
return s
else:
return reverse_recursion(s[1:]) + s[0]
2. הדרך הטובה ביותר להפוך מחרוזת ב-Python
ניתן להפוך מחרוזת באמצעות מספר אלגוריתמים. כבר ראינו שישה מהם. אך איזה מתוך כולם אתה צריך לבחור כדי להפוך מחרוזת? אפשר להשתמש ב־מודול timeit כדי להריץ מספר רב של חזרות של פונקציות אלו ולקבל את הזמן הממוצע הנדרש להם לרוץ. כל הפונקציות לעיל מאוחסנות בקובץ פייתון בשם string_reverse.py
. ביצעתי את כל הפונקציות הללו אחת אחרי השני 100,000 פעמים באמצעות מודול timeit וקיבלתי את הממוצע של ה-5 הרצות הטובות ביותר.
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_slicing("ABç∂EF"*10)'
100000 loops, best of 5: 0.449 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_list("ABç∂EF"*10)'
100000 loops, best of 5: 2.46 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_join_reversed_iter("ABç∂EF"*10)'
100000 loops, best of 5: 2.49 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_for_loop("ABç∂EF"*10)'
100000 loops, best of 5: 5.5 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_while_loop("ABç∂EF"*10)'
100000 loops, best of 5: 9.4 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_recursion("ABç∂EF"*10)'
100000 loops, best of 5: 24.3 usec per loop
הטבלה למטה מציגה את התוצאות והאיטיות של אלגוריתם מהטוב ביותר.
Algorithm | TimeIt Execution Time (Best of 5) | Slowness |
---|---|---|
Slicing | 0.449 usec | 1x |
List reverse() | 2.46 usec | 5.48x |
reversed() + join() | 2.49 usec | 5.55x |
for loop | 5.5 usec | 12.25x |
while loop | 9.4 usec | 20.94x |
Recursion | 24.3 usec | 54.12x |
3. סיכום
עלינו להשתמש בקיסוס כדי להפוך מחרוזת ב-Python. הקוד שלו פשוט מאוד וקטן ואנו לא צריכים לכתוב לוגיקה משלנו כדי להפוך את המחרוזת. גם זו הדרך המהירה ביותר להפוך מחרוזת, כפי שזוהה על ידי הרצות הבדיקה למעלה.
ניתן לבדוק את סקריפט הפייתון השלם ועוד דוגמאות בפייתון ממערכת הגיטהאב שלנו.
4. הפניות
Source:
https://www.digitalocean.com/community/tutorials/python-reverse-string