如何将已排序的列表分组为该列表中连续元素的起点和终点的元组?

2024-04-19 07:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我的排序列表是这样的:

L = ["01-string","02-string","03-string","05-string","07-string","08-string"]

如您所见,此列表已排序。我现在想要这个列表中每个连续字符串块的起点和终点,例如,这个的输出应该是:

L_continuous = [("01-string", "03-string"),("05-string","05-string"),("07-string","08-string")]

所以,澄清一下,我需要一个元组列表,在每个元组中,我需要列表中每个连续块的起点和终点。例如,我的列表中的元素0、1和2是连续的,因为01、02、03是连续的数字,所以起点和终点应该是“01 string”和“03 string”。你知道吗

数字1-3是连续的,所以它们形成一个块,而5在列表中没有任何连续的数字,所以它自己形成一个块。你知道吗


Tags: 字符串元素列表string排序数字元组continuous
2条回答

不是一句话,但这样的话可能行得通:

L = ["01-string","02-string","03-string","05-string","07-string","08-string"]
counter = None
# lastNum = None
firstString = ""
lastString = ""
L_continuous = list()
for item in L:
    currentNum = int(item[0:2])
    if counter is None:
        # startTuple
        firstString = item
        counter = currentNum
        lastString = item
        continue
    if counter + 1 == currentNum:
        # continuation of block
        lastString = item
        counter += 1
        continue
    if currentNum > counter + 1:
        # end of block
        L_continuous.append((firstString,lastString))
        firstString = item
        counter = currentNum
        lastString = item
        continue
    else:
        print ('error - not sorted or unique numbers')
# add last block
L_continuous.append((firstString,lastString))

print(L_continuous)

首先要做的是从字符串数据中提取一个int,这样我们就可以比较连续的数字:

def extract_int(s):
    return int(s.split('-')[0])

然后一个简单的解决方案是跟踪最后看到的数字,当它与前一个数字不连续时发出一个新的块。在循环结束时,我们需要发出一块“剩余”的东西。你知道吗

def group_by_blocks(strs):
    blocks = []
    last_s = first_s = strs[0]
    last_i = extract_int(last_s)

    for s in strs[1:]:
        i = extract_int(s)
        if i != last_i + 1:
            blocks.append( (first_s, last_s) )
            first_i, first_s = i, s
        last_i, last_s = i, s

    blocks.append( (first_s, last_s) )
    return blocks

示例:

>>> group_by_blocks(L)
[('01-string', '03-string'), ('05-string', '05-string'), ('07-string', '08-string')]

相关问题 更多 >