リスト内の連続する増加する番号をグループ化する[重複]
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に追加します