提问人:Marcin Tomasz Gradowski 提问时间:11/13/2023 最后编辑:tripleeeMarcin Tomasz Gradowski 更新时间:11/15/2023 访问量:57
仅打印列表中最长的非重叠范围
Print only longest non-overlapping ranges from list
问:
我需要从列表中选择许多不同的非重叠范围。
数据:
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)]
答:
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)
评论