2024-06-02 07:55:55 发布
网友
我有一个数字列表,我需要把它分组。itertools.grouby对于相同数字的序列非常有效,但是对于具有阈值(2-3%)的数字,我需要相同的行为
itertools.grouby
电子邮件:lst = [1, 500, 19885, 19886, 19895, 90000000] 我希望[[1], [500], [19885, 19886, 19895], [90000000]]
lst = [1, 500, 19885, 19886, 19895, 90000000]
[[1], [500], [19885, 19886, 19895], [90000000]]
你能给我点建议吗?在
您仍然可以使用groupby,但要使用自定义比较器:
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
然后:
请注意,这将保留第一个值作为“参考”,因此在一个组中,元素与键/第一个值的距离最多为2%,但在组内,偏差可能会达到4%。在
这对你所展示的数据来说应该没问题,因为不同的组之间有显著的差异,但是对于紧密的组来说,这是不可靠的。在
扔掉他们。你需要提前手动计算出休息时间。你能提前分类吗?那样会更容易些。在
实际上,如果使用log,那么乘法阈值就变成了一个常量阈值,例如logland~=(-0.02,+0.02)中的0.98..1.02。 所以,用你所有的数字记录。 在进行groupby之前,你还需要把它们扔掉。在
如果你想要代码,给我们一个更好的(随机种子)可复制的例子,它有更多的数字来测试角落案例。在
您仍然可以使用
groupby
,但要使用自定义比较器:然后:
^{pr2}$请注意,这将保留第一个值作为“参考”,因此在一个组中,元素与键/第一个值的距离最多为2%,但在组内,偏差可能会达到4%。在
这对你所展示的数据来说应该没问题,因为不同的组之间有显著的差异,但是对于紧密的组来说,这是不可靠的。在
扔掉他们。你需要提前手动计算出休息时间。你能提前分类吗?那样会更容易些。在
实际上,如果使用log,那么乘法阈值就变成了一个常量阈值,例如logland~=(-0.02,+0.02)中的0.98..1.02。 所以,用你所有的数字记录。 在进行groupby之前,你还需要把它们扔掉。在
如果你想要代码,给我们一个更好的(随机种子)可复制的例子,它有更多的数字来测试角落案例。在
相关问题 更多 >
编程相关推荐