繁体   English   中英

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

[英]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. 您正在反转整个列表,而不仅仅是该片段。 假设列表为[1,2,3,4] ,并且我们想反转下半部分,即get [1,2,4,3] ; 按照您的方法,您将从倒排的列表[4,3,2,1]获取第三个和第四个元素,最后得到[1,2,2,1]
  2. 该对索引的范围内是唯一的,因此通过使用range(17)然后range(18,35)等,你在在索引元件错过了1735 ,和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM