Python groupby阈值

时间:2016-10-28 06:46:36

标签: python group-by itertools

我有一个数字列表,我需要对它进行分组。 itertools.grouby完全适用于相同数字的序列,但对于具有阈值(2-3%)的数字,我需要相同的行为

E.X:lst = [1, 500, 19885, 19886, 19895, 90000000] 我希望[[1], [500], [19885, 19886, 19895], [90000000]]

你能给我一些建议吗?

2 个答案:

答案 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之前,你仍然需要将它们打包。

如果你想要代码,给我们一个更好的(随机播种)可重现的例子,它有更多的数字来测试角落情况。