我有一个号码列表,我需要把它分组。对于相同数目的序列,itertools.grouby可以很好地工作,但是对于阈值数(2-3%),我需要同样的行为。
lst = [1, 500, 19885, 19886, 19895, 90000000]和我希望[[1], [500], [19885, 19886, 19895], [90000000]]
你能给我点建议吗?
发布于 2016-10-28 06:56:18
您仍然可以使用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%。
这应该与您已经显示的数据是好的,如果不同的组是显著分开,但它将是不可靠的密切组。
发布于 2016-10-28 06:54:35
打他们。你需要事先手工算出断点。那么,你能事先整理一下吗?这会让事情变得更容易。
实际上,如果使用log,那么乘性阈值就会变成一个恒定的阈值,例如在原木~= (-0.02,+0.02)中的0.98.1.02。所以,用你所有数字的日志。在做groupby之前,您仍然需要对它们进行敲击。
如果你想要代码,给我们一个更好的(随机种子)可重复的例子,有更多的数字测试角落案例。
https://stackoverflow.com/questions/40299538
复制相似问题