繁体   English   中英

合并列表中的重叠项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM