为什么不返回给定数字的旋转?

时间:2011-12-09 20:49:15

标签: python

我会尝试用一个例子来解释我想要做的事情:

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  

6 个答案:

答案 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']

现在,在你的情况下,你做错了什么

  1. 您正在弹出数字,并始终在开头插入。
  2. 在列表中插入列表
  3. 你知道你能以更轻松的方式做到这一点吗?

    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是一个生成器,用于创建一个迭代器,它将产生所需的列表。

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

执行时间要短得多。