合并列表中的重叠项

时间:2014-03-27 06:42:39

标签: python list merge

我的目标是在下面的示例列表中合并重叠的元组。

如果项目落在下一个范围内,则必须合并两个元组。生成的元组是覆盖两个项目范围(最小值到最大值)的元组。例如; [(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)]

有关如何获得所需输出的任何建议(如果可能的话,用更少的行)?感谢。

2 个答案:

答案 0 :(得分:4)

基于@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)]

答案 1 :(得分:2)

您可以在O(nlogn)

中解决此问题

首先,您需要按照它的起点对间隔进行排序。之后,您将创建一个新堆栈,并为每个间隔执行以下操作:

如果它为空,只需按下当前间隔即可 如果不是,则检查堆栈中的第一个间隔是否与当前间隔重叠。如果是,则弹出它,将其与当前间隔合并,然后推回结果。如果它没有,你只需按当前间隔即可。检查所有间隔后,堆栈将包含所有合并的间隔。