我有一个数字列表,我需要对它进行分组。 itertools.grouby
完全适用于相同数字的序列,但对于具有阈值(2-3%)的数字,我需要相同的行为
E.X:lst = [1, 500, 19885, 19886, 19895, 90000000]
我希望[[1], [500], [19885, 19886, 19895], [90000000]]
你能给我一些建议吗?
答案 0 :(得分:1)
您仍然可以使用groupby
但使用自定义比较器:
class MyValue:
def __init__(self, val):
self.val = val
def __eq__(self, other):
# 2% leeway
return self.val*0.98 <= other.val <= self.val*1.02
然后:
for key, group in groupby(map(MyValue, values)):
group_values = [el.val for el in group]
请注意,这会将第一个值保留为“引用”,因此在组中,元素与键/第一个值的距离最多为2%,但在组内部,偏差最多可达4 %。
对于您显示的数据,这应该没问题,不同的群体是显着分开的,但是对于密切的群体来说它不可靠。
答案 1 :(得分:0)
铲斗他们。您需要提前手动计算休息时间。你能提前排序吗?这样会更容易。
实际上,如果你使用log,则乘法阈值变成一个恒定的阈值,例如log-land中的0.98..1.02〜=( - 0.02,+ 0.02)。 因此,请使用所有数字的日志。 在进行groupby之前,你仍然需要将它们打包。
如果你想要代码,给我们一个更好的(随机播种)可重现的例子,它有更多的数字来测试角落情况。