我的目标是在下面的示例列表中合并重叠的元组。
如果项目落在下一个范围内,则必须合并两个元组。生成的元组是覆盖两个项目范围(最小值到最大值)的元组。例如; [(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)]
有关如何获得所需输出的任何建议(如果可能的话,用更少的行)?感谢。
答案 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)
中解决此问题首先,您需要按照它的起点对间隔进行排序。之后,您将创建一个新堆栈,并为每个间隔执行以下操作:
如果它为空,只需按下当前间隔即可 如果不是,则检查堆栈中的第一个间隔是否与当前间隔重叠。如果是,则弹出它,将其与当前间隔合并,然后推回结果。如果它没有,你只需按当前间隔即可。检查所有间隔后,堆栈将包含所有合并的间隔。