Python3 制作一个列表,按一定量递增,按一定量递减

标签 python python-3.x

如果我有以下情况: [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],我们想要反转后半部分,即得到[1,2,4,3];按照您的方法,您将从反向列表中取出第三个和第四个元素 [4,3,2,1],并最终得到 [1,2,2,1]
  2. 范围内的目标索引是独占的,因此通过使用 range(17) 然后使用 range(18,35) 等等,您会错过位于索引 173553
  3. 处的元素

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

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/

相关文章:

python - 如何从重定向的 URL 下载文件?

python - child 有多个外键给 parent ?

python - 在 Python 中将一个数据帧中的值替换为第二个数据帧中的值

python - 合并列中的行并删除空白行

python - 用于 Python 的 OpenGL 矩阵数学实用程序?

具有输入函数和多个条件检查的 Python while 循环

python - 如何使用 np.array() 和 np.arange(3) 的组合手动创建一个三乘三乘三的 NumPy 数组?

python - 如何提取图像的边界(OCT/视网膜扫描图像)

python - 调整内容大小时,QTableWidget 尊重跨度

python - 在 Python 中创建大型随机内容文件