2013-03-05 40 views
2

我一直在學習Python並與Project Euler一起玩,以重新修復我的一些數學技能。我遇到了Problem 35的問題。我已經產生了100萬以下的所有獎金,淘汰了那些包含任何偶數的獎金,現在我只想用剩下的〜3k素數運行最後一張支票。Python:'For'loop只運行一次,Project Euler

這個功能應該是:

  1. 就拿〜3K素數的列表。
  2. 返回由原始列表中每個項目的所有旋轉列表組成的新列表。

這裏是我有,人有我所理解的每一行:

def rotations(lst): 
    newlist = [] 
    for i in lst:            # Take each int item in list. 
     s = [int(j) for j in str(i)]       # Turn each item into a list of digit strings 
     num = ([s[k:]+s[:-len(s)+k] for k in range(len(s))]) # Generate list of rotations of strings 
     tmplst = [] 
     for l in num:           # For each string rotation 
      tmplst.append(int(''.join(map(str,l))))   # Turn it into an integer, add that int to tmplst 
     newlist.append(tmplst)         # Add each tmplist to 'newlist' 
    return newlist 

輸入rotations([123,456])只收益率:

[[123, 231, 312]] 

當我期待

[[123, 231, 312],[456,564,645]] 

任何可能會出錯的線索?

+3

不能再現,得到'[[123,231,312],[456,564,645]]'。 – 2013-03-05 17:36:17

回答

8

每當有人有一個代碼,其他人(包括我自己)不能再現奇怪的行爲,我立即想:空白錯誤。並看看你的代碼:

' def rotations(lst):' 
'   newlist = []' 
'   for i in lst:            # Take each int item in list. ' 
'   \t s = [int(j) for j in str(i)]       # Turn each item into a list of digit strings' 
'   \t num = ([s[k:]+s[:-len(s)+k] for k in range(len(s))]) # Generate list of rotations of strings ' 
'   \t tmplst = [] ' 
'   \t for l in num:           # For each string rotation' 
"    \t  tmplst.append(int(''.join(map(str,l))))   # Turn it into an integer, add that int to tmplst" 
"    \t newlist.append(tmplst)         # Add each tmplist to 'newlist'" 
'     return newlist' 
'  ' 

它在我看來像你可能混合標籤和空格。這可能會導致非常神祕的行爲,因爲某些行不像您想象的那樣縮進。與

python -tt your_program_name.py 

確認運行您的程序,如果是的話,切換到使用四個空格的縮進(我指的是「標籤」,它包括四個空格,不\t。)

+3

或僅限空間。 PEP 8建議你只使用空格(我也是)! – 2013-03-05 17:45:57

+0

@MartijnPieters:是的,我也是。我澄清了我的意思是「四空間選項卡」。 – DSM 2013-03-05 17:46:44

+0

這些被稱爲'四空間縮進'; tab是製表符,不僅可用於縮進,還可用於製表符。 :-)縮進!=標籤,標籤!=縮進。 – 2013-03-05 17:47:29

1

空白錯誤在前面的回答中提到的問題說明了直接的問題 - 在for i in lst:的第一次傳遞結束時返回一個結果,而不是在循環完成後返回 - 但它也可以使代碼簡化,從而減少代碼,並且錯誤更容易現貨。這裏是一個例子(功能從rotations更名爲rotor區分)。

def rotor(lst): 
    out = [] 
    for i in lst: 
     s = str(i) 
     out.append([int(s[k:]+s[:k]) for k in range(len(s))]) 
    return out 

鑑於上述情況,rotor([456, 1789, 25887])返回

[[456, 564, 645], 
[1789, 7891, 8917, 9178], 
[25887, 58872, 88725, 87258, 72588]] 
+0

這比我有更多的可讀性。我對整個Python世界已經足夠新,所以我通常可以開發一個程序,但它通常很難看。感謝您的明確的代碼。 – MDd 2013-03-05 18:49:30