Python3创建一个列表,该列表增加一定量,减少一定量 - python

如果我有以下内容:
[0, 1, 2, 3, 4, 5, 6...]如何重新排序列表(实际上是创建列表的新副本),然后像这样填充它:

[0, 1, 2, 3, 4, 5, 10, 9, 8, 7, 6, 11, 12, 13...]

即每五次迭代,列表开始减少或增加。我要执行此操作的原因是,我有一个对象列表,并且想要以不同的顺序用对象填充新列表。

我尝试的一种技术是:

copied_icons = [{key:'Object1'}, {key:'Object2'}, {key:'Object3'}...] 
reversed_copied_icons = copied_icons[::-1]
left_to_right = []


for h in range(17):
    left_to_right.append(copied_icons[h])

for j in range(18, 35):
    left_to_right.append(reversed_copied_icons[j])

for k in range(36, 53):
    left_to_right.append(copied_icons[k])

for l in range(54, 71):
    left_to_right.append(reversed_copied_icons[l])

但是由于某种原因,这会使列表乱序返回并复制某些对象。我想知道在填充我的列表时是否有更简单的方法来交替递增和递减。

python大神给出的解决方案

您的方法存在两个问题:

您正在反转整个列表,而不仅仅是该片段。假设列表为[1,2,3,4],而我们想倒转下半部分,即获取[1,2,4,3];按照您的方法,您将从倒排的列表[4,3,2,1]中获取第三个元素和第四个元素,最后得到[1,2,2,1]
范围中的to-index是互斥的,因此使用range(17)然后使用range(18,35)依此类推,您就错过了索引173553上的元素。

您可以对要反转的不同部分使用循环,然后以相反的顺序用相同的切片替换列表的该切片。

lst = list(range(20))
for start in range(5, len(lst), 10):
    lst[start:start+5] = lst[start+4:start-1:-1]

或如评论中所指出的那样,它也摆脱了那些讨厌的不合一的索引:

for start in range(5, len(lst), 10):
    lst[start:start+5] = reversed(lst[start:start+5])

之后,lst[0, 1, 2, 3, 4, 9, 8, 7, 6, 5, 10, 11, 12, 13, 14, 19, 18, 17, 16, 15]

或者,如果要反转的间隔是不规则的(这似乎在您的问题中):

reverse = [(3, 7), (12,17)]
for start, end in reverse:
    lst[start:end] = reversed(lst[start:end])