[英]Python3 Make a list that increments for a certain amount, decrements for a certain amount
如果我具有以下内容: [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]
,并且我们想反转下半部分,即get [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])
这似乎可以实现您的目标:
def foo(lst, n=5):
""" lst=list to be re-ordered, n=item count before reversal """
new_list = list()
direction = 1
start = 0
end = start
while start < len(lst):
# process through the list in steps of 'n',
# except use min for possible stub at end.
end = start + min(n, len(lst) - start) # i.e. start+5
# If direction is 1, append list to new list. Otherwise, append reversed list.
new_list[start:end] = lst[start:end][::direction]
direction *= -1 # Switch directions
start = end # Jump to new starting position.
return new_list
lst = np.arange(20).tolist()
foo(lst,5)
[0, 1, 2, 3, 4, 9, 8, 7, 6, 5, 10, 11, 12, 13, 14, 19, 18, 17, 16, 15]
如果要删除方向* = -1,则代码将简单地将现有列表(lst)复制为大小为'n'的块,即您想要的数量,然后反转列表。
在要更改方向的上方,[:: direction]将为[:: 1](在这种情况下,列表将以常规顺序排序),或者在其他情况下,[::-1]在此情况下,列表将为对于正在处理的大小为n的块反转。 切片列表时的第三个参数是“步长”参数,因此步骤-1以相反的顺序返回列表的副本。
如果存在存根,即如果列表中有22个元素,但存根为2,但您的“ n”以5为步长,那么您需要调整步长“ n”,这样就不会超过您的清单。 min(n,len(lst)-开始)将确保您不会超出列表的末尾。 另外,也许更清楚,您可以使用end = min(start + n,len(lst))。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.