在Python中如何对列表进行平移?

4

如何在Python中将列表向左移动x位,并用零填充空值?

向左移动1位

输入:[1, 2, 3, 4] 输出:[2, 3, 4, 0]

向左移动2位

输入:[1, 2, 3, 4] 输出:[3, 4, 0, 0]


1
del items[0]; items.append(0) 用于单次移位。 - John Gordon
1
你可以使用一个最大长度为4的collections.deque - Mark
没有所谓的“Python数组”。这个语法指的是列表。 - Hamza
3个回答

3
就我而言,没有“简单”的方法,因为Python的列表没有受到大小的限制,但是你可以轻松实现一个处理这个问题的算法:
def shift_left(arr, n):
    return arr[n:] + [0 for _ in range(n)]

或稍微简洁一些:

def shift_left(arr, n):
    return arr[n:] + [0] * n

没有所谓的“Python数组”。这个语法指的是列表。 - Hamza
虽然这并没有太大的区别...但是好吧,我会更改答案以使用正确的术语。 - João Haas

1
您可以结合numpy的appendroll方法:
import numpy as np


def shift_left(x_, r):
    return np.append(np.roll(x_, -r)[:-r], [0 for _ in range(0, r)])


print(shift_left([1, 2, 3, 4], 1))
print(shift_left([1, 2, 3, 4], 2))

结果:

[2 3 4 0]
[3 4 0 0]

解释


当你在列表上使用 roll 时:
print(np.roll([1, 2, 3, 4], -2))

结果:

[3 4 1 2]

您需要将每个元素向左移动r次(r= -2)。但我们不想要最后的r个元素,因此:

print(np.roll([1, 2, 3, 4], -2)[:-2])

结果:

[3 4]

我们希望最后 r 个值为0,所以我们可以将 r 个0添加到数组的末尾。
print(np.append(np.roll([1, 2, 3, 4], -2)[:-2], [0 for _ in range(0, 2)]))

结果:

[3 4 0 0]

2
我错过了 return 关键字,现在它返回的是实际结果。 - Ahmet

1
您可以将两个列表连接起来,方法如下:

arr[shift:]+[0]*shift

或者,如果你像我一样喜欢链式编程:

arr[shift:].__add__([0]*shift)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接