假设我的排序列表是这样的:
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字符串”和“ 03字符串”。
数字1-3是连续的,因此它们形成一个块,而数字5在列表中没有任何连续的数字,因此它本身就形成了一个块。
首先要做的是从字符串数据中提取一个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')]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句