내 정렬 된 목록이 다음과 같다고 가정합니다.
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는 목록에 연속적인 숫자가 없으므로 자체적으로 블록을 형성합니다.
가장 먼저 할 일은 문자열 데이터에서 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] 삭제
몇 마디 만하겠습니다