[英]Merging overlapping items in a list
我的目标是在下面的示例列表中合并重叠的元组。
如果项目落在下一个范围内,则必须合并两个元组。 生成的元组是覆盖两个项目范围(最小值到最大值)的元组。 例如; [(1,6),(2,5)]
将导致[(1,6)]
,因为[2,5]
落在[(1,6)]
的范围内
mylist=[(1, 1), (1, 6), (2, 5), (4, 4), (9, 10)]
我的尝试:
c=[]
t2=[]
for i, x in enumerate(mylist):
w=x,mylist[i-1]
if x[0]-my[i-1][1]<=1:
d=min([x[0] for x in w]),max([x[1] for x in w])
c.append(d)
for i, x in enumerate(set(c)):
t=x,c[i-1]
if x[0]-c[i-1][1]<=1:
t1=min([x[0] for x in t]),max([x[1] for x in t])
t2.append(t1)
print sorted(set(t2))
派生输出:
[(1, 6), (1, 10)]
期望的输出:
[(1, 6), (9, 10)]
关于如何获得所需输出的任何建议(如果可能的话,用更少的行)? 谢谢。
基于@Valera的答案,python实现:
mylist=[(1, 6), (2, 5), (1, 1), (3, 7), (4, 4), (9, 10)]
result = []
for item in sorted(mylist):
result = result or [item]
if item[0] > result[-1][1]:
result.append(item)
else:
old = result[-1]
result[-1] = (old[0], max(old[1], item[1]))
print result # [(1, 7), (9, 10)]
你可以在O(nlogn)中解决这个问题
首先,您需要按照起点对时间间隔进行排序。 之后,您将创建一个新堆栈,并为每个间隔执行以下操作:
如果它是空的,只要按下当前间隔,如果不是,则检查堆栈中的第一个间隔是否与当前间隔重叠。 如果是,则弹出它,将其与当前间隔合并,然后推回结果。 如果没有,您只需按当前间隔即可。 检查所有间隔后,堆栈将包含所有合并的间隔。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.