목록의 연속 증가 번호 그룹화 [중복]

Nov 24 2020

연속 증가하는 정수를 목록으로 그룹화하려면 어떻게해야합니까? 예를 들어 다음과 같은 정수 목록이 있습니다.

numbers = [0, 5, 8, 3, 4, 6, 1]

다음과 같이 요소를 그룹화하고 싶습니다.

[[0, 5, 8], [3, 4, 6], [1]]

다음 정수는 이전보다 많지만 동일한 중첩 목록에 계속 추가하십시오. 다음 정수가 더 작은 경우 중첩 목록을 기본 목록에 추가하고 다시 시작하십시오.

몇 가지 다른 방법 (while 루프, for 루프, 열거 및 범위)을 시도했지만 다음 정수가 더 큰 한 동일한 중첩 목록에 추가하는 방법을 알아낼 수 없습니다.

result = []

while (len(numbers) - 1) != 0:
    group = []

    first = numbers.pop(0)
    second = numbers[0]

    while first < second:
        group.append(first)
        
        if first > second:
            result.append(group)
        break

답변

8 megargayu Nov 24 2020 at 06:37

for 루프를 사용할 수 있습니다.

numbers = [0, 5, 8, 3, 4, 6, 1]
result = [[]]
last_num = numbers[0] # last number (to check if the next number is greater or equal)
for number in numbers:
    if number < last_num:
        result.append([]) # add a new consecutive list
    result[-1].append(number) 
    last_num = number # set last_num to this number, so it can be used later
print(result)

참고 : 이 사용하지 않는 .pop(), 소위 numbers목록 체류 그대로. 또한, 하나의 루프 = O (N) 시간 복잡도 !!

2 piterbarg Nov 24 2020 at 06:46

팬더가 허용되면 다음을 수행합니다.

import pandas as pd
numbers = [0, 5, 8, 3, 4, 6, 1]
df = pd.DataFrame({'n':numbers})
[ g['n'].values.tolist() for _,g in df.groupby((df['n'].diff()<0).cumsum())]

생산하다

[[0, 5, 8], [3, 4, 6], [1]]
1 ppwater Nov 24 2020 at 06:47

다음과 같이 할 수 있습니다.

numbers = [0, 5, 8, 3, 4, 6, 1]
result = []
while len(numbers) != 0:
    secondresult = []
    for _ in range(3):
        if numbers != []:
            toappend = numbers.pop(0)
            secondresult.append(toappend)
        else:
            continue
    result.append(secondresult)
print(result)

while 및 for 루프를 사용하십시오. 두 번째 결과 및 결과에 추가