Python切片命令忘记了循环

Giu*_*lia 0 python

我想通过定期扩展输入中给出的那些来构建一些列表(a,b,c,d).

周期性的结构是这样的,每个列表的第一个元素不能重复,而所有其他元素必须一直到达输入中设置的最大长度(周期可能不会重复整数次数).

举个例子,如果我有输入

a = [1, 2, 3, 4]          max_len=11
Run Code Online (Sandbox Code Playgroud)

我想获得输出

a = [1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2]
Run Code Online (Sandbox Code Playgroud)

我写了这段代码:

for mylist in [a, b, c d]:   
    period = mylist[1:]     # all elements but the first are repeated
    while len(mylist)< max_len: 
        mylist.extend(period)
    mylist = mylist[:max_len]   # cut to max_len                        
    print mylist
print a, b, c, d
Run Code Online (Sandbox Code Playgroud)

如果我运行这个,我从两个打印命令看到我的列表是我希望它们在程序仍处于循环中时的方式,但是当它们离开循环时它们会回到"非切片"长度,是,a回到大于max_len的长度,其中周期恰好重复4次:

 a = [1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

这是为什么?看起来该程序忘记了切片(但不是扩展名).

我知道这是一个非常简单的问题,我可以用其他方式绕过它,但我想理解为什么这个想法不起作用.谢谢您的帮助!

NPE*_*NPE 6

问题是mylist = mylist[:max_len]创建一个新列表而不是mylist在适当的位置进行修改,因此结果永远不会传播回a等人.

如果你替换:

mylist = mylist[:max_len]
Run Code Online (Sandbox Code Playgroud)

mylist[:] = mylist[:max_len]
Run Code Online (Sandbox Code Playgroud)

那会解决它.

另外,您可以使用itertools转换:

In [10]: [a[0]] + [v for v in itertools.islice(itertools.cycle(a[1:]), max_len - 1)]
Out[10]: [1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2]
Run Code Online (Sandbox Code Playgroud)