Python 中的反轉字符串reversed(),切片

當我們經常在代碼中使用 Python 字符串時,您可能需要以相反的順序使用它們。Python 包含一些方便的工具和技術,可以在這些情況下為您提供幫助。使用它們,您將能夠快速有效地構建現有字符串的反向副本。

瞭解這些在 Python 中反轉字符串的工具和技術將幫助您提高作為 Python 開發人員的熟練程度。

在本教程中,萬平米將學到:

  • 通過切片快速構建反向字符串
  • 使用和創建現有字符串的反向副本reversed().join()
  • 使用迭代和遞歸手動反轉現有字符串
  • 對字符串執行反向迭代
  • 使用相反的順序對字符串進行排序sorted()

為瞭最大限度地利用本教程,你應該知道的基本知識串,for以及while循環和遞歸。

一、使用核心 Python 工具反轉字符串

在某些特定情況下,可能需要以相反的順序使用 Python字符串。例如,假設您有一個字符串,並且想要一種快速的方法來反轉它以獲取. 您可以使用哪些 Python 工具來提供幫助?”ABCDEF""FEDCBA

字符串在 Python 中是不可變的,因此不可能原地反轉給定的字符串。您需要創建目標字符串的反向副本以滿足要求。

Python 提供瞭兩種直接的方法來反轉字符串。由於字符串是序列,因此它們是indexablesliceableiterable。這些功能允許您使用切片以相反的順序直接生成給定字符串的副本。第二個選項是使用內置函數reversed()創建一個迭代器,該迭代器以相反的順序生成輸入字符串的字符。

二、通過切片反轉字符串

切片是一種有用的技術,它允許您使用稱為offsets的整數索引的不同組合從給定序列中提取項目。當涉及到切片字符串時,這些偏移量定義瞭切片中第一個字符的索引、停止切片的字符的索引,以及一個定義每次迭代要跳過多少個字符的值。

要對字符串進行切片,可以使用以下語法:

a_string[start:stop:step]


你的偏移量startstopstep。此表達式從startto stop − 1by 中提取所有字符step。稍後您將更深入地瞭解這一切意味著什麼。

所有偏移量都是可選的,它們具有以下默認值:

這裡,start表示切片中第一個字符stop的索引,同時保存停止切片操作的索引。第三個偏移量step允許您決定切片在每次迭代中將跳過多少個字符。

註意:切片操作在達到等於或大於 的索引時完成stop。這意味著它永遠不會在最終切片中包含該索引處的項目(如果有)。

該step偏移允許您微調如何,而跳過其他從字符串中提取所需的字符:

>>>
>>> letters = "AaBbCcDd"

>>> # Get all characters relying on default offsets
>>> letters[::]
'AaBbCcDd'
>>> letters[:]
'AaBbCcDd'

>>> # Get every other character from 0 to the end
>>> letters[::2]
'ABCD'

>>> # Get every other character from 1 to the end
>>> letters[1::2]
'abcd'

在這裡,您首先在letters不提供顯式偏移值的情況下進行切片以獲取原始字符串的完整副本。為此,您還可以使用省略第二個冒號 ( :)的切片。隨著step等於2,切片會從目標字符串中的每個其它字符。您可以使用不同的偏移量來更好地瞭解切片的工作原理。

為什麼切片和第三個偏移量與 Python 中的字符串反轉有關?答案在於如何step處理負值。如果為 提供負值step,則切片向後運行,即從右到左。

例如:如果您設置為stepequal -1,那麼您可以構建一個以相反順序檢索所有字符的切片:

>>>
>>> letters = "ABCDEF"

>>> letters[::-1]
'FEDCBA'

>>> letters
'ABCDEF'

此切片返回從字符串右端(索引等於 )到len(letters) – 1字符串左端(索引為 )的所有字符0。當您使用此技巧時,您會以相反的順序獲得原始字符串的副本,而不會影響 的原始內容letters。

創建現有字符串的反向副本的另一種技術是使用slice(). 這個內置函數的簽名如下:

slice(start, stop, step)


此函數接受三個參數,與切片運算符中的偏移量具有相同的含義,並返回一個切片對象,表示調用range(start, stop, step).

我們可以使用slice()來模擬切片[::-1]並快速反轉字符串。繼續並slice()在方括號內運行以下調用:

>>>
>>> letters = "ABCDEF"

>>> letters[slice(None, None, -1)]
'FEDCBA'

傳遞None給 的前兩個參數slice()告訴函數您要依賴其內部默認行為,這與沒有start和值的標準切片相同stop。換句話說,傳遞None給start和stop意味著您需要從底層序列的左端到右端的切片。

三、使用.join()和反轉字符串reversed()

第二種,可以說是最 Pythonic 的反轉字符串的方法是reversed()與str.join(). 如果您將字符串傳遞給reversed() ,您將獲得一個以相反順序生成字符的迭代器:

>>>
>>> greeting = reversed("Hello, World!")

>>> next(greeting)
'!'
>>> next(greeting)
'd'
>>> next(greeting)
'l'


當您將next()withgreeting作為參數調用時,您會從原始字符串的右端獲取每個字符。

需要註意的重要一點reversed()是,生成的迭代器直接從原始字符串中生成字符。換句話說,它不會創建一個新的反向字符串,而是從現有字符串反向讀取字符。這種行為在內存消耗方面相當有效,並且在某些上下文和情況下(例如迭代)可能是一個根本性的勝利。

我們可以使用reversed()直接調用獲得的迭代器作為參數.join():

>>>
>>> "".join(reversed("Hello, World!"))
'!dlroW ,olleH'


在這個單行表達式中,您將調用的結果reversed()直接作為參數傳遞給.join() 。因此,您將獲得原始輸入字符串的反向副本。的組合reversed() ,並.join()為扭轉字符串一個很好的選擇。

四、手動生成反轉字符串

到目前為止,您已經瞭解瞭快速反轉字符串的核心 Python 工具和技術。大多數時候,它們將是您的最佳選擇。但是,您可能需要在編碼冒險的某個時刻手動反轉字符串。

在本節中,您將學習如何使用顯式循環和遞歸來反轉字符串。最後一種技術在 Pythonreduce()函數的幫助下使用函數式編程方法。

五、反轉循環中的字符串

您將用於反轉字符串的第一種技術涉及for循環和連接運算符 ( +)。使用兩個字符串作為操作數,此運算符返回一個連接原始字符串的新字符串。整個操作稱為串聯。

註意:使用.join()是在 Python 中連接字符串的推薦方法。它幹凈、高效且Pythonic。

這是一個函數,它接受一個字符串並使用串聯在循環中反轉它:

>>>
>>> def reversed_string(text):
...     result = ""
...     for char in text:
...         result = char + result
...     return result
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'

在每次迭代中,循環采用後續字符char, fromtext並將其與 的當前內容連接起來result。請註意,result最初保存的是一個空字符串 ( “”)。然後將新的中間字符串重新分配給result。在循環結束時,result保存一個新字符串作為原始字符串的反向副本。

註意:由於 Python 字符串是不可變的數據類型,您應該記住本節中的示例使用瞭一種浪費技術。它們依賴於創建連續的中間字符串,隻是為瞭在下一次迭代中將它們丟棄。

如果您更喜歡使用whileloop,那麼您可以執行以下操作來構建給定字符串的反向副本:

>>>
>>> def reversed_string(text):
...     result = ""
...     index = len(text) - 1
...     while index >= 0:
...         result += text[index]
...         index -= 1
...     return result
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'


在這裡,您首先使用 計算index輸入字符串中最後一個字符的len()。循環從index下到並包括0。在每次迭代中,您都使用擴充賦值運算符 ( +=) 創建一個中間字符串,該字符串將 的內容result與來自 的相應字符連接起來text。同樣,最終結果是通過反轉輸入字符串產生的新字符串。

六、用遞歸反轉字符串

我們還可以使用遞歸來反轉字符串。遞歸是指函數在自己的主體中調用自身。為瞭防止無限遞歸,您應該提供一個無需再次調用函數即可生成結果的基本情況。第二個組件是遞歸 case,它啟動遞歸循環並執行大部分計算。

下面是如何定義一個遞歸函數,該函數返回給定字符串的反向副本:

>>>
>>> def reversed_string(text):
...     if len(text) == 1:
...         return text
...     return reversed_string(text[1:]) + text[:1]
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'


在本例中,您首先檢查基本情況。如果輸入字符串隻有一個字符,則將該字符串返回給調用者。

最後一個語句,即遞歸情況,調用reversed_string()自身。該調用使用text[1:]輸入字符串的切片作為參數。此切片包含 中的所有字符text,第一個除外。下一步是將遞歸調用的結果與text[:1]包含 的第一個字符的單字符串 相加text。

在上面的例子中需要註意的一個重要問題是,如果你將一個長字符串作為參數傳遞給reversed_string(),那麼你將得到一個RecursionError:

>>>
>>> very_long_greeting = "Hello, World!" * 1_000

>>> reversed_string(very_long_greeting)
Traceback (most recent call last):
    ...
RecursionError: maximum recursion depth exceeded while calling a Python object


達到 Python 的默認遞歸限制是您應該在代碼中考慮的一個重要問題。但是,如果您確實需要使用遞歸,那麼您仍然可以選擇手動設置遞歸限制。

您可以通過調用getrecursionlimit()from來檢查當前 Python 解釋器的遞歸限制sys。默認情況下,此值通常為1000。您可以使用setrecursionlimit()來自同一模塊的sys. 使用這些函數,您可以配置 Python 環境,以便您的遞歸解決方案可以工作。來試試看吧!

使用reduce()扭轉字符串
如果您更喜歡使用函數式編程方法,則可以使用reduce()fromfunctools來反轉字符串。Pythonreduce()將折疊或歸約函數和可迭代對象作為參數。然後它將提供的函數應用於輸入迭代中的項目並返回單個累積值。

以下是您可以如何利用reduce()反轉字符串的方法:

>>>
>>> from functools import reduce

>>> def reversed_string(text):
...     return reduce(lambda a, b: b + a, text)
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'


在此示例中,該lambda函數采用兩個字符串並以相反的順序連接它們。調用在循環中reduce()應用lambdatotext並構建原始字符串的反向副本。

七、反向遍歷字符串

有時您可能希望以相反的順序遍歷現有字符串,這種技術通常稱為反向迭代。根據您的特定需求,您可以使用以下選項之一對字符串進行反向迭代:

  • 該reversed()內置功能
  • 切片運算符, [::-1]

反向迭代可以說是這些工具最常見的用例,因此在以下幾節中,您將瞭解如何在迭代上下文中使用它們。

八、該reversed()內置功能

以相反順序迭代字符串的最可讀和 Pythonic 的方法是使用reversed() . 不久前,當您將它與.join()創建反向字符串一起使用時,您已經瞭解瞭該函數。

但是,主要意圖和用例reversed()是支持 Python 可迭代對象的反向迭代。以字符串作為參數,reversed()返回一個迭代器,該迭代器以相反的順序從輸入字符串中產生字符。

以下是如何以相反的順序迭代字符串reversed():

>>>
>>> greeting = "Hello, World!"

>>> for char in reversed(greeting):
...     print(char)
...
!
d
l
r
o
W

,
o
l
l
e
H

>>> reversed(greeting)
<reversed object at 0x7f17aa89e070>

for此示例中的循環非常具有可讀性。的名稱reversed()清楚地表達瞭其意圖並傳達瞭該函數不會對輸入數據產生任何副作用。由於reversed()返回一個迭代器,循環在內存使用方面也很有效。

九、切片運算符, [::-1]

對字符串執行反向迭代的第二種方法是使用您之前在a_string[::-1]示例中看到的擴展切片語法。即使這種方法不利於內存效率和可讀性,它仍然提供瞭一種快速迭代現有字符串的反向副本的方法:

>>>
>>> greeting = "Hello, World!"

>>> for char in greeting[::-1]:
...     print(char)
...
!
d
l
r
o
W

,
o
l
l
e
H

>>> greeting[::-1]
'!dlroW ,olleH'

在本例中,我們應用切片運算符greeting來創建它的反向副本。然後你使用那​​個新的反向字符串來饋送循環。在這種情況下,您正在迭代一個新的反向字符串,因此該解決方案的內存效率低於使用reversed().

十、創建自定義可逆字符串

如果您曾經嘗試過反轉 Python 列表,那麼您就會知道列表有一個方便的方法,稱為原位.reverse()反轉底層列表。由於字符串在 Python 中是不可變的,因此它們不提供類似的方法。

但是,您仍然可以使用.reverse()模仿list.reverse(). 您可以這樣做:

>>>
>>> from collections import UserString

>>> class ReversibleString(UserString):
...     def reverse(self):
...         self.data = self.data[::-1]
...


ReversibleString繼承自UserString,它是collections模塊的一個類。UserString是str內置數據類型的包裝器。它是專門為創建str. UserString當您需要創建具有附加功能的自定義字符串類時非常方便。

UserString提供與常規字符串相同的功能。它還添加瞭一個稱為.data持有的公共屬性,並允許您訪問包裝的字符串對象。

在裡面ReversibleString,你創造.reverse()。此方法反轉包裝的字符串.data並將結果重新分配回.data. 從外部看,調用的.reverse()工作就像將字符串反轉到位。然而,它實際上做的是創建一個新的字符串,以相反的順序包含原始數據。

以下是ReversibleString實踐中的工作原理:

>>>
>>> text = ReversibleString("Hello, World!")
>>> text
'Hello, World!'

>>> # Reverse the string in place
>>> text.reverse()
>>> text
'!dlroW ,olleH'


當您調用.reverse()on 時text,該方法就像您正在對底層字符串進行就地更改一樣。但是,您實際上是在創建一個新字符串並將其分配回包裝的字符串。請註意,text現在以相反的順序保存原始字符串。

由於UserString提供與其超類相同的功能str,因此您可以reversed()開箱即用地執行反向迭代:

>>>
>>> text = ReversibleString("Hello, World!")

>>> # Support reverse iteration out of the box
>>> for char in reversed(text):
...     print(char)
...
!
d
l
r
o
W

,
o
l
l
e
H

>>> text
"Hello, World!"

在這裡,您調用reversed()withtext作為參數來提供for循環。此調用按預期工作並返回相應的迭代器,因為UserString從str. 請註意,調用reversed()不會影響原始字符串。

十一、以相反的順序對 Python 字符串進行排序

我們將學習的最後一個主題是如何以相反的順序對字符串的字符進行排序。當您不按特定順序處理字符串並且需要按逆字母順序對它們進行排序時,這會很方便。

要解決此問題,您可以使用sorted(). 這個內置函數返回一個列表,其中包含輸入可迭代的所有項目。除瞭輸入可迭代之外,sorted()還接受reverse關鍵字參數。True如果您希望輸入可迭代對象按降序排序,則可以將此參數設置為:

>>>
>>> vowels = "eauoi"

>>> # Sort in ascending order
>>> sorted(vowels)
['a', 'e', 'i', 'o', 'u']

>>> # Sort in descending order
>>> sorted(vowels, reverse=True)
['u', 'o', 'i', 'e', 'a']

當您sorted()使用字符串作為參數調用並reverse設置為 時True,您會得到一個包含輸入字符串字符的倒序或降序列表。由於sorted()返回一個list對象,您需要一種方法將該列表轉換回字符串。

同樣,我們可以.join()像在前面的部分中一樣使用:

>>>
>>> vowels = "eauoi"

>>> "".join(sorted(vowels, reverse=True))
'uoiea'

在此代碼片段中,您調用.join()瞭一個空字符串,它扮演著分隔符的角色。參數 to.join()是調用sorted()withvowels作為參數並reverse設置為 的結果True。

您還可以利用sorted()以排序和反向順序遍歷字符串:

>>>
>>> for vowel in sorted(vowels, reverse=True):
...     print(vowel)
...
...
u
o
i
e
a


reverse給的說法sorted()可以讓你排序iterables,包括字符串,按降序排列。因此,如果您需要按逆字母順序排序的字符串字符,那麼sorted()適合您。

結論:

以相反的順序反轉和處理字符串可能是編程中的一項常見任務。Python 提供瞭一組工具和技術,可以幫助您快速有效地執行字符串反轉。在本教程中,您瞭解瞭這些工具和技術以及如何在字符串處理挑戰中利用它們。

總結:

  • 通過切片快速構建反向字符串
  • 使用reversed()和創建現有字符串的反向副本.join()
  • 使用迭代和遞歸手動創建反向字符串
  • 以相反的順序循環遍歷字符串
  • 使用降序對字符串進行排序 sorted()

盡管本主題本身可能沒有很多令人興奮的用例,但瞭解如何反轉字符串對於入門級職位的編碼面試很有用。您還會發現掌握反轉字符串的不同方法可以幫助您真正概念化 Python 中字符串的不變性,這是該語言的一個顯著特性。

到此這篇關於Python 中的反轉字符串reversed(),切片 的文章就介紹到這瞭,更多相關Python 中的反轉字符串 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: