python - 为索引范围内的每个项目制作 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])
有没有更优雅的方法,例如使用itertools
or zip
?
解决方案
我会计算子列表的最小/最大起始索引,而不是走得太远(和过滤)或不够远(并且遗漏一些东西!):
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)]
推荐阅读
- image - Xamarin Forms iOS Share Instagram Photo 不起作用
- javascript - 如何在 FlatList 中选择多个项目,突出显示它们并将它们保存在 React Native 中
- java - SunCertPathBuilderException:无法找到请求目标的有效证书路径
- excel - 关闭并重新打开excel后VBA无法读取文件
- python - 如何连续运行 python 脚本直到打印输出?
- django - Django 2.2 升级——mongoengine 查询性能
- excel - 将表格大小调整为字典
- javascript - 离线页面的渲染在实时服务器上不起作用
- c# - 使用 linq 对重复项的属性值进行分组和合并
- vba - 如何编码以使 Intellisense 遵循完整的链