【问题标题】:find non-overlapping blocks in a list在列表中查找不重叠的块
【发布时间】:2014-06-30 08:49:56
【问题描述】:

我有一个清单: x = [[263, 3121], [2201, 4756], [3145, 6423], [4765, 8165], [12480 , 18421], [18000, 24191], [26343, 28105], [27341, 28912], [29497强>, 30282]]

我想要一个包含合并重叠块的新列表(上面以粗体突出显示): y = [[263,8165],[12480,24191],[26343,28912],[29497,30282]]

即遍历x-list,合并所有重叠的list,得到y。如果x中list的下一项的第一项小于x中上一项的最后一项,则将两者合并并保存到y,否则不合并只是把新的起始值作为下一项在 y。继续通过 x,直到所有重叠的块都合并并写入 y。

感谢您的帮助

【问题讨论】:

  • 为什么这个问题被否决了?

标签: python list merge


【解决方案1】:

您可以按照文中描述的方式写下代码。

def yield_data(data):
    start = None
    end = None
    for entry in sorted(data):
        if start is None:
            start = entry[0]
        if end is None or entry[0] < end:
            end = entry[1]
        else:
            yield [start, end]
            start, end = entry
    yield [start, end]


def main():
    x = [[263, 3121], [2201, 4756], [3145, 6423], [4765, 8165], [12480, 18421],
         [18000, 24191], [26343, 28105], [27341, 28912], [29497, 30282]]
    for group in yield_data(x):
        print(group)

if __name__ == '__main__':
    main()

None 的比较用于在第一个循环中初始化数据。

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 2022-01-10
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多