2012-07-16 13 views
3

目前我有一個是希望通過一個巨大的串碼。它比較這樣的字符串:告訴Python來停止在for循環中比較當它到達的最後一個字符

a = 0 
for letter in my_str: 
    a += 1 
    if letter <= my_str[a]: 

它一直比較直到最後,當我得到'字符串索引超出範圍'的錯誤。我知道這是因爲它試圖將字符串中的最後一個字符與下一個字符(不存在)進行比較。如何解決這個問題!我覺得我已經嘗試了一切。幫助讚賞。

編輯:好像我剛剛想出我的解決方案...感謝反正。

+1

您可以發佈自己的解決方案,並接受它,如果你認爲它是最好的。 – jamylak 2012-07-16 04:34:34

+1

順便說一句,你永遠不應該命名你的變量「str」:這可能會導致與字符串數據類型的衝突,以及潛在的奇怪行爲。 – abought 2012-07-16 04:43:21

+0

@abought我將它改爲'my_str'。 – jamylak 2012-07-16 04:45:56

回答

-2

我只是增加了一個if語句在類似下面的開始..

if a < len(str): 

唐不知道爲什麼花了我很長時間才弄明白這一點!使用索引遍歷時,他們用繩子工作

2

使用成對的配方從itertools

>>> from itertools import tee, izip 
>>> def pairwise(iterable): 
     "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
     a, b = tee(iterable) 
     next(b, None) 
     return izip(a, b) 

>>> text = 'abc' 
>>> for x, y in pairwise(text): 
     if x <= y: 
      pass 
+0

這可能是一個初學者有點嚇人,但'拉鍊(文本,文本)'和'拉鍊(文本,文本[1:])'都沒有那麼糟糕一起玩,以獲取指數無感覺迭代。 – DSM 2012-07-16 04:40:45

+0

@DSM我喜歡時,我可以用itertools,在配方堵不能傷害,即使你不只要你知道它的工作原理的理解,它來自一個可信賴的來源,使用戶可以得出這樣的結論必須高效。他還說*目前我的代碼正在查看一個巨大的字符串*,因此較短的'zip'版本效率不高。 – jamylak 2012-07-16 04:43:45

+1

你可能是對的,雖然我並不總是看到人們認爲「巨大」的印象。 – DSM 2012-07-16 04:44:59

1

你可能想要的是

for i in range(len(str)-1): 
    if str[i] <= str[i+1]: 
2

避免。相反,目前的字母比較到下一個的,比較當前信以前一個,你們從最後一次循環保存。初始化循環外部的「previous」變量,使其成爲第一遍合理的內容。

lastletter = "" 
for letter in text: 
    if lastletter <= letter: # always true for first char 
     # do something 
    lastletter = letter 
相關問題