如果我有以下情况:
[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])
但由于某种原因,这会乱序返回列表并重复某些对象。我想知道是否有一种更简单的方法可以在填充列表时交替递增和递减。
最佳答案
您的方法有两个问题:
- 您正在反转整个列表,而不仅仅是该部分。假设列表是
[1,2,3,4]
,我们想要反转后半部分,即得到[1,2,4,3]
;按照您的方法,您将从反向列表中取出第三个和第四个元素[4,3,2,1]
,并最终得到[1,2,2,1]
- 范围内的目标索引是独占的,因此通过使用
range(17)
然后使用range(18,35)
等等,您会错过位于索引17
、35
和53
处的元素
您可以使用循环来反转不同的部分,然后以相反的顺序用相同的切片替换列表的该切片。
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])
关于Python3 制作一个列表,按一定量递增,按一定量递减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28754280/