[英]How can I group a sorted list into tuples of start and endpoints of consecutive elements of this list?
假設我的排序列表是這樣的:
L = ["01-string","02-string","03-string","05-string","07-string","08-string"]
如您所見,此列表已排序。 我現在想要這個列表中每個連續字符串塊的起點和終點,例如,output 應該是:
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 在列表中沒有任何連續的數字,因此 forms 本身就是一個塊。
不是單線,但這樣的事情可能會起作用:
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')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.