リスト内の連続する増加する番号をグループ化する[重複]

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リストはそのまま残ります。また、1つのループ= 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ループを使用します。そしてそれらをsecondresultとresultに追加します