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

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パッケージには、このタスクを正確に実行するためのロール関数が含まれています

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 に答える