首页 > 解决方案 > 查找列表中的序列号及其开始和结束索引

问题描述

所以我有一个包含一些值的列表,例如:

timeSum = [0,0,0,1,1,2,3,3,3,2,3]

我需要得到包含最大值的区间边界。

所以我创建了一个包含最大值索引的列表:

maxTime = [i for i, j in enumerate(timeSum) if j == max(timeSum)]

这给了我:[6,7,8,10]

现在,据我所知,我需要找到序列号边界的序列才能获得类似的输出:6:810 但我不太确定该怎么做。

标签: pythonlistrange

解决方案


我想我解决了这个问题。请看下面的代码。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

timeSum = [0,0,0,1,1,2,3,3,3,2,3]

maxTime = [i for i, j in enumerate(timeSum) if j == max(timeSum)]

is_range = []
not_range = []

for i in range(len(maxTime)):
    try:
        if maxTime[i + 1] - maxTime[i] == 1:
            is_range.append(f"{maxTime[i]}:{maxTime[i + 1]}")
    except:
        if str(maxTime[i]) not in "".join(is_range):
            not_range.append(maxTime[i])


def f(arg):
    for i in range(len(arg)):
        try:
            split1 = arg[i].split(":")
            split2 = arg[i + 1].split(":")
            if split1[-1] == split2[0]:
                arg[i] = arg[i].replace(split1[-1], split2[-1])
                arg.pop(i + 1)
        except:
            pass
    for i in range(len(arg)):
        try:
            split1 = arg[i].split(":")
            split2 = arg[i + 1].split(":")
            if split1[-1] == split2[0]:
                return f(arg)
            else:
                return arg
        except:
            return arg


new_list = f(is_range)
new_list.extend(not_range)

print(new_list)

输出1:

['6:8', 10]

如果列表如下所示,

timeSum = [0,0,0,1,1,2,3,3,3,2,3,3,3]

输出2:

['6:8', '10:12']

如果列表如下所示,

timeSum = [0,0,0,1,1,2,3,3,3,3,2,3,3,3,3]

输出如下:

输出3:

['6:9', '11:14']

推荐阅读