정렬 된 목록을이 목록의 연속 요소의 시작 및 끝점의 튜플로 그룹화하려면 어떻게해야합니까?

소라스

내 정렬 된 목록이 다음과 같다고 가정합니다.

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")]

따라서 명확히하기 위해 튜플 목록이 필요하며 각 튜플에는 목록에있는 각 연속 블록의 시작과 끝 점이 필요합니다. 예를 들어, 01,02,03이 연속 된 숫자이기 때문에 내 목록의 요소 0, 1 및 2는 연속적입니다. 따라서 시작 및 끝점은 "01- 문자열"과 "03- 문자열"이됩니다.

숫자 1-3은 연속되어 블록을 형성하는 반면 5는 목록에 연속적인 숫자가 없으므로 자체적으로 블록을 형성합니다.

카야 3

가장 먼저 할 일은 문자열 데이터에서 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관