列表的循环值

时间:2018-10-06 00:06:37

标签: python python-3.x list for-loop

我是编码的新手,正在尝试编写一个简单的代码,该代码将包含一个列表,例如[1,2,3],并将元素循环n次。因此,如果n = 1,我应该得到A = [3,1,2]。如果n = 2,我应该得到A = [2,3,1]。我编写的代码是:

n=1
j=0
A = [1,2,3]
B = [None]*len(A)

while j<=n:
     for i in range(0,len(A)):
         B[i] = A[-1+i]
     j=j+1
print(B)

问题是,无论n的值是多少,我都会得到相同的答案,该答案仅循环一次。我认为问题在于循环每次都循环通过相同的B,因此我需要将新的B存储为其他东西,然后用新的B重复循环。但是我不知道该怎么做。任何提示将不胜感激

6 个答案:

答案 0 :(得分:6)

我认为您过于复杂了。考虑将其更改为以下内容:

n = 1
A = [1,2,3]
B = A.copy()

for _ in range(n):
    # Cycle through by concatenating the last element and all other elements together 
    B = [B[-1]]+B[0:-1]

print(B)

如果是n=1,您将得到[3, 1, 2],而n=2会给您[2, 3, 1]

请注意,您尝试执行的操作是在numpy.roll中实现的(我想您是在询问过程,而不是结果,只是为了以防万一)

import numpy as np

>>> np.roll(A,1)
array([3, 1, 2])
>>> np.roll(A,2)
array([2, 3, 1])

答案 1 :(得分:5)

一个更简单的功能是:

def roll(L, n):
    n %= len(L)
    return L[-n:] + L[:-n]

A = [1,2,3]
roll(A, 1)   # [3, 1, 2]
roll(A, 2)   # [2, 3, 1]
roll(A, 3)   # [1, 2, 3]
roll(A, 4)   # [3, 1, 2]

采用模数(n %= len(L))无需保持循环通过。然后,我们将适当大小的切片从列表的末尾连接到其开头。

答案 2 :(得分:2)

有关代码问题,请参见@sacul's answer。但是list并不是最适合这种要求的结构,因为每个班次都具有O( n )复杂度。

collections模块中的

deque(“双端队列”)通过其rotate方法提供了此功能。此方法在原位运行 并具有O( k )复杂度,其中 k 是表示转数的参数。这是一个示例:

from collections import deque

d = deque([1,2,3])
d.rotate(2)

print(d)

deque([2, 3, 1])

答案 3 :(得分:1)

@sacul的答案有效,但是您很接近!创建新的A后,您错过了while循环的下一次迭代的B更新。

n=1
j=0
A = [1,2,3]
B = [None]*len(A)

while j<=n:
    for i in range(0,len(A)):
        B[i] = A[-1+i]
    A = B[:] # update A so that next time B works on the new A 
    print('A is now ', A) # to debug
    j=j+1

print(B)

这将导致以下打印语句:

A is now  [3, 1, 2]                                                                                                                   
A is now  [2, 3, 1]                                                                                                                   
[2, 3, 1] # this is what finally B is

答案 4 :(得分:0)

基于itertools的解决方案

from itertools import cycle, islice

def roll(x, n):
    start = len(x) - n
    return islice(cycle(x), start, start + len(x))

如果我们循环遍历x中的值(实际上最多只能执行两次)。然后对其进行切片,以使其从所需的元素开始,并包含正确数量的元素。

它可能比其他一些解决方案更深奥,但由于有很多选择,因此值得一提。

itertools.islice返回一个生成器。如果要打印结果,则需要将其转换为list

答案 5 :(得分:-1)

因为有人已经回答了您的问题,所以不做深入介绍。但是这里要注意的一个重要属性是

A = [1, 2, 3] #Assuming that the length of the matrix you want to rotate is of length 3

If you want to cycle/rotate by 3, then you want to actually cycle/rotate by `len(A)%3` = 0
If you want to cycle/rotate by 6, then you want to actually cycle/rotate by `len(A)%6` = 0
If you want to cycle/rotate by 4, then you want to actually cycle/rotate by `len(A)%3` = 1
If you want to cycle/rotate by a number lesser than the length itself.. then just rotate it by that number!

so if you want to cycle by 2, then well.. rotate it by two..