如果我有以下内容:[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)
依此类推,您就错过了索引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])