【问题标题】:Merging overlapping items in a list合并列表中的重叠项目
【发布时间】:2014-05-05 23:36:39
【问题描述】:

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

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

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

【问题讨论】:

  • 您的问题不清楚。请改写
  • 合并和重叠的标准是什么?还不清楚
  • 如果输入之一是(3, 7),输出应该是什么?
  • @thefourtheye 如果输入之一是 (3,7),则输出将为 [(1,7),(9,10)]

标签: python list merge


【解决方案1】:

你可以在 O(nlogn) 内解决这个问题

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

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

【讨论】:

  • 只是演示一下,让我们看看输出。
  • 我不会用python写代码,但是你问的是一个非常有名的算法问题,可以通过这个算法来解决。我希望你的 Python 知识能让你实现它,因为没有什么太复杂
  • @m.wasowski O(NlogN) + O(N)?
【解决方案2】:

根据@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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多