替换 python 列表中的特定模式索引项
replace specific patterned indexed items in python list
我想替换列表中的每 2 个备选项目。示例如下:
a = [1, 2, 3, 9, 4, 1, 2, 2, 3, 3, 4, 2, 5, 2, 3]
结果应该是:
[1, ' ' , ' ', 9, ' ', ' ', 2, ' ', ' ', 3, ' ', ' ', 5, ' ', 3]
不应替换最后一项和第一项
我有循环暴力枚举方法来做到这一点。我很好奇是否有任何简单的替代方法可以做到这一点。
这是一个具有列表理解的变体(创建一个新列表):
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]
或者以更好的space效率,不创建不必要的切片和字符串:
a[1:-1:3] = (' ' for _ in range(1, len(a)-1, 3))
a[2:-1:3] = (' ' for _ in range(2, len(a)-1, 3))
一个简单的 for
就地更改循环实际上在速度和 space 方面都是最有效的:
for i in range(1, len(a) - 1):
if i % 3:
a[i] = ' '
我想替换列表中的每 2 个备选项目。示例如下:
a = [1, 2, 3, 9, 4, 1, 2, 2, 3, 3, 4, 2, 5, 2, 3]
结果应该是:
[1, ' ' , ' ', 9, ' ', ' ', 2, ' ', ' ', 3, ' ', ' ', 5, ' ', 3]
不应替换最后一项和第一项
我有循环暴力枚举方法来做到这一点。我很好奇是否有任何简单的替代方法可以做到这一点。
这是一个具有列表理解的变体(创建一个新列表):
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]
或者以更好的space效率,不创建不必要的切片和字符串:
a[1:-1:3] = (' ' for _ in range(1, len(a)-1, 3))
a[2:-1:3] = (' ' for _ in range(2, len(a)-1, 3))
一个简单的 for
就地更改循环实际上在速度和 space 方面都是最有效的:
for i in range(1, len(a) - 1):
if i % 3:
a[i] = ' '