我有一个列表,其中包含具有不同增量的不断增加的数字“组”。这是一个例子:
l = [0, 1, 5, 8, 10, 20, 30, 40, 45, 48, 77, 100, 200, 300, 400]
我想回来:
[[0], [1], [5], [8], [10, 20, 30, 40], [45], [48], [77], [100, 200, 300, 400]]
解释:0、1、5、8 不遵循固定增量(+1、+4、+3),而 [10、20、30、40] 都有固定的 +10 增量。
我知道如何使用 for 循环和 curr_group
、curr_delta
等变量来完成此操作,但我想避免这种情况。
使用 pandas,我能够得到这个:
import pandas as pd
df = pd.DataFrame({'col': [0, 1, 5, 8, 10, 20, 30, 40, 45, 48, 77, 100, 200, 300, 400]})
df['shift_diff'] = (df.diff() != df.diff().shift(-1)).astype('int')
df['group'] = df.shift_diff.cumsum()
print list(df.groupby('group').col.apply(list))
输出
[[0], [1], [5], [8], [10, 20, 30], [40], [45], [48], [77], [100, 200, 300], [400]]
非常接近,但所有长度 > 1 的组([10, 20, 30]
和 [100, 200, 300]
)都缺少最后一个元素.
如果有一个简短而优雅的解决方案,我们将不胜感激!谢谢
最佳答案
这是你想要的吗?
df['group'] = (~((df-df.shift()).diff().eq(0)|(df-df.shift(-1)).diff().eq(0))).cumsum()
print(list(df.groupby('group').col.apply(list)))
[[0], [1], [5], [8], [10, 20, 30, 40], [45], [48], [77], [100, 200, 300, 400]]
关于python - 在列表中查找数字递增(具有不同增量)的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47087099/