Python:'For'循环只运行一次,Project Euler

2 投票
2 回答
12687 浏览
提问于 2025-04-17 18:02

我最近在学习Python,并且在做Project Euler的题目,以此来提高我的数学技能。我遇到了一个问题,具体是关于第35题。我已经生成了100万以下的所有质数,去掉了那些包含偶数的质数,现在只想对剩下的约3000个质数进行最后的检查。

这个函数的目的应该是:

  1. 接收一个包含约3000个质数的列表。
  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]]

有没有什么线索可以帮我找出问题出在哪里?

2 个回答

1

之前提到的空白错误是导致你遇到问题的直接原因——它是在第一次循环结束时就返回了结果,而不是等整个循环都完成后再返回。不过,简化你的代码也是个好主意,这样代码会更少,错误也更容易发现。下面是一个例子(把函数名从 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]]
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)。

撰写回答