当前位置: 代码迷 >> python >> 替换python列表中的特定模式索引项目
  详细解决方案

替换python列表中的特定模式索引项目

热度:56   发布时间:2023-06-19 09:33:19.0

我想替换列表中的每2个替代项。 下面的例子:

a = [1, 2, 3, 9, 4, 1, 2, 2, 3, 3, 4, 2, 5, 2, 3]

结果应为:

[1, ' ' , ' ', 9,  ' ',  ' ', 2,  ' ', ' ', 3, ' ', ' ', 5, ' ', 3]

最后一项和第一项不应更换

我有for循环暴力列举方法。 我很好奇是否有任何简便的替代方法可以做到这一点。

一个简单的for循环就地更改实际上在速度和空间上都是最有效的:

for i in range(1, len(a) - 1):
    if i % 3:
        a[i] = ' '

这是一个具有列表理解功能的变体(创建新列表):

lst = [a[0]] + \
      [item if n % 3 == 2 else ' ' for n, item in enumerate(a[1:-1])] + \
      [a[-1]]

或者如果您想就地执行,则更加简洁:

a[1:-1] = [item if n % 3 == 2 else ' ' for n, item in enumerate(a[1:-1])]

您可以使用切片分配仅使需要更改的索引突变:

a = [1, 2, 3, 9, 4, 1, 2, 2, 3, 3, 4, 2, 5, 2, 3]
a[1:-1:3] = ' ' * len(a[1:-1:3])
a[2:-1:3] = ' ' * len(a[2:-1:3])
# [1, ' ', ' ', 9, ' ', ' ', 2, ' ', ' ', 3, ' ', ' ', 5, ' ', 3]

或者具有更好的空间效率,而不创建不必要的切片和字符串:

a[1:-1:3] = (' ' for _ in range(1, len(a)-1, 3))
a[2:-1:3] = (' ' for _ in range(2, len(a)-1, 3))
  相关解决方案