1

我正在尝试循环移动数组的元素,以便所有元素都替换为前一个元素,最后一个元素旋转到第一个位置,如下所示: shift(1, [5, 6, 7])=>[7, 5、6]。

以下代码仅返回 [7,5]。有人可以告诉我是什么导致这种情况发生吗?我一步一步地浏览了代码,根本找不到解决方案。我还尝试了 3 种不同的口译员。

def shift(key, array):
    counter = range(len(array)-1)
    new = counter
    for i in counter:
        new[i] = array[i-key]
    return new

print shift(1, [5, 6, 7])
4

8 回答 8

13

range(5)返回[0, 1, 2, 3, 4]。它不包括5.

只需删除-1from range(len(array)-1),它应该可以工作。

您还可以使用列表切片:

def shift(key, array):
    return array[-key:] + array[:-key]
于 2013-04-08T03:41:57.370 回答
6

Here is the python way:

def shift(key, array):
    return array[-key:]+array[:-key]
于 2013-04-08T03:46:42.733 回答
4

您需要-1从您的范围中删除:

counter = range(len(array))

如果您想要更快的方法,您可以尝试使用双端队列吗?

from collections import deque

def shift(key, array):
    a = deque(array) # turn list into deque
    a.rotate(key)    # rotate deque by key
    return list(a)   # turn deque back into a list


print (shift(1, [5, 6, 7]))
于 2013-04-08T03:44:37.927 回答
1

答案很好,但是如果键大于数组的长度,它就不起作用。如果您认为密钥会大于数组长度,请使用以下命令:

def shift(key, array):
    return array[key % len(array):] + array[:key % len(array)]

正键将向左移动,负键将向右移动。

于 2013-04-08T04:22:07.217 回答
1

numpy包包含用于执行此任务的roll函数:

import numpy as np
b=[5,6,7]
c=np.roll(b,1).tolist()

>>> c
[7, 5, 6]

使用它并返回列表的函数是:

def shift(array,key):
    return np.roll(array,key).tolist()
于 2016-06-16T13:40:42.533 回答
0
#!/usr/bin/env python

def ashift(key,array):
        newqueue = array[-key:]
        newqueue.extend( array[:-key] )
        return newqueue


print ashift( 1, [5,6,7] )
print ashift( 2, [5,6,7] )

结果是:

$ ./shift 
[7, 5, 6]
[6, 7, 5]

唯一的潜在损失是如果数组足够大,您可能会遇到内存问题,因为此操作正在执行复制。使用绝对值大于数组长度的“键”将导致回绕,结果可能与预期不符,但不会出错。

于 2013-04-08T04:43:12.113 回答
0

老式的 POP & APPEND

arr = [5, 6, 7]

for _ in range(0, 2):
    shift = arr.pop(0)
    arr.append(shift)

print(arr)

=>[7, 5, 6]
于 2019-02-16T14:51:29.243 回答
0

你可以使用numpy 卷

>>> x = np.arange(10)
>>> np.roll(x, 2)
array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
>>> np.roll(x, -2)
array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
于 2021-06-02T19:25:26.393 回答