python groupby使用comparator函数/lambda代替key函数

python groupby使用comparator函数/lambda代替key函数,python,Python,我有一个INT列表 l = [17811, 17831, 17843, 28996, 37606, 44325, 44365, 44387] 我想返回彼此之间在一定距离内的组,例如30: [[17811, 17831, 17843], [28996], [37606], [44325], [44365, 44387]] 我想要一个函数,它允许我传递一个比较器: magic.groupby(l, lambda(a,b): abs(a-b) < 30) magic.groupby(l,l

我有一个INT列表

l = [17811, 17831, 17843, 28996, 37606, 44325, 44365, 44387]
我想返回彼此之间在一定距离内的组,例如30:

[[17811, 17831, 17843], [28996], [37606], [44325], [44365, 44387]]
我想要一个函数,它允许我传递一个比较器:

magic.groupby(l, lambda(a,b): abs(a-b) < 30)
magic.groupby(l,lambda(a,b):abs(a-b)<30)

这样一个简单的表达式存在吗

您可以将
itertools.groupby
与自定义类一起使用:

import itertools
class Val:
   def __init__(self, _v):
     self.v = _v
   def __eq__(self, _obj):
     return abs(self.v - _obj.v) < 30

l = [17811, 17831, 17839, 28996, 37606, 44325, 44365, 44387]
result = [list(b) for _, b in itertools.groupby(l, key=Val)]

您可以将
itertools.groupby
与自定义类一起使用:

import itertools
class Val:
   def __init__(self, _v):
     self.v = _v
   def __eq__(self, _obj):
     return abs(self.v - _obj.v) < 30

l = [17811, 17831, 17839, 28996, 37606, 44325, 44365, 44387]
result = [list(b) for _, b in itertools.groupby(l, key=Val)]

如果一个数字属于两组,例如:[1,29,58]?您预期的行为是什么?组中所有成员的abs距离是否都应小于30,或者当组中其他成员的abs距离小于30时,是否应包含一个元素?如果单个数字属于两个组,例如:[1、29、58]?您预期的行为是什么?如果组中的所有成员的abs距离都小于30,或者当组中的其他成员的abs距离小于30时,是否应包含一个元素?@kaya3是正确的,奇怪的相等可以导致奇怪的结果:@kaya3是正确的,奇怪的相等可以导致奇怪的结果: