仅打印列表中最长的非重叠范围

Print only longest non-overlapping ranges from list

提问人:Marcin Tomasz Gradowski 提问时间:11/13/2023 最后编辑:tripleeeMarcin Tomasz Gradowski 更新时间:11/15/2023 访问量:57

问:

我需要从列表中选择许多不同的非重叠范围。

数据:

data = [
    "5628-6203",
    "4753-5325",
    "4690-5322",
    "4684-4923",
    "5652-6191",
    "5628-6203",
    "5628-6203", 
    "5628-6203",
    "17333-17563",
    "17333-17569",
    "17333-17557"
]

法典:

# Parsing and sorting the data
ranges = [tuple(map(int, item.split('-'))) for item in data]
ranges.sort(key=lambda x: x[0])

# Finding the longest non-overlapping ranges
non_overlapping_ranges = []
current_range = ranges[0]

for r in ranges[1:]:
    # Check for overlap
    if r[0] <= current_range[1]:
        # Merge overlapping ranges
        current_range = (current_range[0], max(current_range[1], r[1]))
    else:
        # Add the previous range to the result
        non_overlapping_ranges.append(current_range)
        # Move to the next range
        current_range = r

# Add the last range
non_overlapping_ranges.append(current_range)

# Sorting by range length and getting the longest ranges
longest_ranges = sorted(non_overlapping_ranges, key=lambda x: x[1] - x[0], reverse=True)

print(longest_ranges)

数据变量的预期输出以及我对更大数据的期望:

[(4690, 5322), (5628, 6203), (17333,17569)]
列表

评论

2赞 Scott Hunter 11/13/2023
使用调试器时,第一行不执行预期操作的是什么?

答:

0赞 Reilas 11/15/2023 #1

“仅打印列表中最长的非重叠范围......

......数据变量的预期输出以及我对更大数据的期望:

[(4690, 5322), (5628, 6203), (17333,17569)]

如果我错了,请纠正我;这些值重叠或重叠。

下面是一个示例。

r = [tuple(map(int, e.split('-'))) for e in data]
for i, (x, a) in enumerate(r):
    for j, (y, b) in enumerate(r):
        if i == j: continue
        if x <= y:
            if x == y or a in range(y, b + 1):
                print((x, a), 'overlaps', (y, b))

输出

(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(4690, 5322) overlaps (4753, 5325)
(4684, 4923) overlaps (4753, 5325)
(4684, 4923) overlaps (4690, 5322)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(5628, 6203) overlaps (5628, 6203)
(17333, 17563) overlaps (17333, 17569)
(17333, 17563) overlaps (17333, 17557)
(17333, 17569) overlaps (17333, 17563)
(17333, 17569) overlaps (17333, 17557)
(17333, 17557) overlaps (17333, 17563)
(17333, 17557) overlaps (17333, 17569)