python - 基于overlapp python合并两个元组列表
问题描述
给定两个列表 x, y 使得它们都已被初始化,如下所示:
x = [(0, 3), (5, 8), (16, 19), (21, 24), (28, 30), (40, 42), (46, 47), (50, 54), (58, 63), (69, 71)]
y = [(9, 10), (26, 27), (29, 31), (35, 36), (41, 43), (48, 49), (66, 67), (70, 72), (77, 78), (85, 86)]
我想形成一个新的元组列表,其中每个元组都有来自 x 的连续元组和来自 y 的重叠元组。
对于上面的示例,输出将是:
[((5, 8) (9, 10) (16, 19)), ((21, 24) (26, 27) (28, 30)), ((28, 30) (29, 31) (40, 42)), ((28, 30) (35, 36) (40, 42)), ((40, 42) (41, 43) (46, 47)), ((46, 47) (48, 49) (50, 54)),((58, 63) (66, 67) (69, 71))]
我的代码:
lst = []
for i in range(len(x)):
if i+1 < len(x):
context = x[i],x[i+1]
for j in y:
if j[0] >= context[0][0] and j[0] <= context[1][0]:
lst.append((context[0],j,context[1]))
我需要更好、更有效的方法来编写这段代码。
解决方案
您可以使用两个变量来跟踪 x 和 y 列表中的索引。使用问题中指定的条件,只要满足给定条件,这些索引就可以递增。在每次迭代中,算法检查是否x[i][0] < y[j][0]
和x[i+1][1] > y[j][1]
( 中的连续元组提供的上限和下限x
。如果这个条件为真,我们增加j
(y-index) 以便我们可以检查下一个元素是否位于给定范围内。否则,我们增加i
(x-index) 并重复该过程。
x = [(0, 3), (5, 8), (16, 19), (21, 24), (28, 30), (40, 42), (46, 47), (50, 54), (58, 63), (69, 71)]
y = [(9, 10), (26, 27), (29, 31), (35, 36), (41, 43), (48, 49), (66, 67), (70, 72), (77, 78), (85, 86)]
i = 0
j = 0
result = list()
while i < len(x) - 1 and j < len(y):
if y[j][0] > x[i][0] and y[j][1] < x[i + 1][1]:
result.append((x[i], y[j], x[i + 1]))
j += 1
else:
i += 1
print(result)
输出 -
[((5, 8), (9, 10), (16, 19)),
((21, 24), (26, 27), (28, 30)),
((28, 30), (29, 31), (40, 42)),
((28, 30), (35, 36), (40, 42)),
((40, 42), (41, 43), (46, 47)),
((46, 47), (48, 49), (50, 54)),
((58, 63), (66, 67), (69, 71))]
推荐阅读
- c - 有人可以帮我解决用 C 语言对数据结构进行排序的问题吗
- python - Python向数据框显示HTML箭头
- json - 通过角度 6 中的 json 文件访问对象数组中的特定对象
- scala - 使用整数键对 scala hashmap 进行排序不起作用
- firebase - 我是否需要对要访问的文档的每个字段进行获取
- c# - 在c# windows窗体中清除画在图片框上的线条
- javascript - 角度量角器循环('一些测试')测试
- jquery - document.on 更改与 element.on 更改
- java - 如何传递按钮意图以使另一个活动中的可绘制更改颜色?
- ios - 反应本机应用程序在调试模式下工作,但在 ios 上不工作发布模式