2

Python を学習し、Project Euler で遊んで、数学のスキルを再調整しています。問題 35の問題に遭遇しました。100 万未満のすべての素数を生成し、偶数を含むものを排除しました。現在、残りの約 3,000 個の素数で最後のチェックを実行しようとしています。

この関数は次のことを想定しています。

  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]]

何がうまくいかないかの手がかりはありますか?

4

2 に答える 2

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

確認し、そうであれば、4 つのスペースのインデントを使用するように切り替えます (これは、4 つのスペースで構成される「タブ」を意味し、 ではありません\t)。

于 2013-03-05T17:43:04.887 に答える
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]]
于 2013-03-05T18:28:51.850 に答える