首页 > 解决方案 > 为索引范围内的每个项目制作 n 长度子列表

问题描述

假设我有一个列表l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']和一个给定的元素e = 'b',我想从元素中创建 3 长度的子列表,不超过3离我们元素的位置,包括元素。我们希望为我们的示例生成以下结果:

[['a', 'b', 'c'], ['b', 'c', 'd']]

正如您所看到的,它不能再向左走,因为元素的位置小于范围,并且它一直到右侧的元素'd'(索引)。4

这是我的原生解决方案:

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
n = len(l)
reach = 3
e = 'b'
idx = l.index(e)
result = []
for i in range(reach):
  lb, rb = idx - i, idx - i + reach
  if lb >= 0:
    result.append(l[lb:rb])

有没有更优雅的方法,例如使用itertoolsor zip

标签: pythonpython-2.7

解决方案


我会计算子列表的最小/最大起始索引,而不是走得太远(和过滤)或不够远(并且遗漏一些东西!):

idx = l.index(e)
min_start = max(idx - reach + 1, 0)
max_start = min(idx, n - reach)
result = [l[i:i+reach] for i in range(min_start, max_start + 1)]

推荐阅读