项目Euler 37的Python循环列表

时间:2014-03-28 11:08:32

标签: python list

所以,我正在做Project Euler 37

我需要传阅一份清单

输入:2345#转换为功能列表

预期产出:[[3,4,5,2],[4,5,2,3],[5,2,3,4],[2,3,4,5]]

这是我的功能

def circulate(n):           #2345
    lst=list(str(n))          #[2,3,4,5]
    res=[]
    for i in range(len(lst)):
        temp=lst.pop(0)
        lst.append(temp)
        print lst             #print expected list 
        res.append(lst)       #but doesn't append as expected
    return res
print circulate(2345)

我的输出是:

['3', '4', '5', '2']
['4', '5', '2', '3']
['5', '2', '3', '4']
['2', '3', '4', '5']
[['2', '3', '4', '5'], ['2', '3', '4', '5'], ['2', '3', '4', '5'], ['2', '3', '4', '5']]

该函数每次打印都是正确的,但不会按预期追加。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您需要将列表的副本附加到res

res.append(lst[:])

您正在添加对正在更改的列表的引用;所有引用都反映了对一个对象所做的更改。

您可能希望改为collections.deque();这个双端列表对象支持使用.rotate()方法进行高效旋转:

from collections import deque

def circulate(n):
    lst = deque(str(n))
    res = []
    for i in range(len(lst)):
        lst.rotate(1)
        res.append(list(lst))
    return res