我会尝试用一个例子来解释我想要做的事情:
Number = ["1","9","7"]
所以我希望它返回:
[["1","9","7"],["9","7","1"],["7","1","9"]]
我得到的是:
[["7","1","9"],["7","1","9"],["7","1","9"]]
出于某些不明原因,它将我的第一个结果替换为最后一个结果。
def Get_Rotations(Number):
Rotations = []
x = 0
while x < len(Number):
Number.insert(0,Number.pop())
Rotations.append(Number)
x += 1
print(Rotations)
return Rotations
答案 0 :(得分:5)
您必须创建Number
的副本。您在每次迭代中操作相同的列表,并将该列表追加到Rotations
三次。因此,您会在其“结束状态”中看到Number
三次。
Rotations.append(list(Number))
那个微小的改变应该可以解决问题! ; - )
答案 1 :(得分:3)
只想提出完全不同的解决方案。
from collections import deque
number = ['1', '9', '7']
rotator = deque(number)
rotations = [number]
for _i in range(len(number) - 1):
rotator.rotate()
rotations += [list(rotator)]
print(rotations)
请注意,此解决方案效率更高。
此代码块运行后,您可能也可能不希望rotator
处于初始状态。您可以将此代码编辑为以下
from collections import deque
number = ['1', '9', '7']
rotator = deque(number)
rotations = []
for _i in range(len(number)):
rotations += [list(rotator)]
rotator.rotate()
print(rotations)
现在rotator
将处于初始number
状态。代码更容易理解,但您在for
中获得了+1周期。
答案 2 :(得分:2)
当您执行Rotations.append(Number)
时,您没有复制Number
,而是添加了对Number
的引用。 Rotations
中的所有三个索引都指向同一个对象(基本上类似于Rotations = [Number, Number, Number]
),因此更改Number将影响所有三个输出。
而是创建一个新数组,用Number
的内容填充它,然后将其添加到Rotations
。
答案 3 :(得分:1)
首先让我给你正确答案
def Get_Rotations(Number):
Rotations = []
x = 0
while len(Number):
Rotations.append(Number.pop())
print(Rotations)
return Rotations
>>> Number = ["1","9","7"]
>>> Get_Rotations(Number)
['7', '9', '1']
['7', '9', '1']
现在,在你的情况下,你做错了什么
你知道你能以更轻松的方式做到这一点吗?
Number[::-1]
>>> Number[::-1]
['7', '9', '1']
答案 4 :(得分:0)
其他答案中很好地解释了您编码不起作用的原因。
我想再说一点。
列表开头的插入非常昂贵。您在此处使用Number.insert(0,...)
O(n)
O(1)
复杂度(附录实际为from itertools import cycle, islice
def rotate(L):
ln = len(L)
it = cycle(iter(L)) #create an overall iterator
for _ in range(ln): #there are len(L) output lists
yield list(islice(it,3)) #slice next 3 elements, for a list and yield the rusult
it.next() #skip one element to start a new list shifted by one
)。
Bellow我将展示使用迭代器做同样事情的另一种方法,迭代器只是循环遍历列表:
rotate
cycle
是一个生成器,用于创建一个迭代器,它将产生所需的列表。
islice
和for el in rotate(Number):
print el
来自have。
使用示例:
['1', '9', '7']
['9', '7', '1']
['7', '1', '9']
输出:
print(list(rotate(Number)))
或者只使用列表构造函数:
[['1', '9', '7'], ['9', '7', '1'], ['7', '1', '9']]
输出:
{{1}}
答案 5 :(得分:0)
一种简单的方法是:
number = ["1","9","7"]
def get_rotations(num):
rotations = []
for i in range(len(num)):
rotations.append(list(num[i:] + num[0:i]))
return rotations
您也可以使用整数而不是字符串化整数列表。例如:
number = 197
def get_rotations(num):
string_num = str(num)
rotations = []
for i in range(len(string_num)):
rotations.append(int(string_num[i:] + string_num[0:i]))
return rotations
这会给:
[197, 971, 719]
执行时间要短得多。