숫자 목록이있어서 그룹화해야합니다. itertools.grouby
작업을 완벽하게 동일한 숫자의 시퀀스하지만 난 임계 값 (2-3 %)의 숫자와 동일한 동작을 필요파이썬 groupby 임계 값
E.X : lst = [1, 500, 19885, 19886, 19895, 90000000]
내가
[[1], [500], [19885, 19886, 19895], [90000000]]
을 기대 당신이 나에게 무언가를 제안 할 수 있습니다?
숫자 목록이있어서 그룹화해야합니다. itertools.grouby
작업을 완벽하게 동일한 숫자의 시퀀스하지만 난 임계 값 (2-3 %)의 숫자와 동일한 동작을 필요파이썬 groupby 임계 값
E.X : lst = [1, 500, 19885, 19886, 19895, 90000000]
내가
[[1], [500], [19885, 19886, 19895], [90000000]]
을 기대 당신이 나에게 무언가를 제안 할 수 있습니다?
당신은 여전히 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 %까지 올라갈 수 있습니다.
서로 다른 그룹이 상당히 구별되었지만 가까운 그룹에서 신뢰할 수없는 데이터로 표시해야합니다.
버켓. 미리 휴식 시간을 수동으로 조정해야합니다. 사전에 분류 할 수 있습니까? 그렇게하면 더 쉬울 것입니다.
실제로 log를 사용하면 곱셈 임계 값이 상수 임계 값으로 바뀝니다. 로그 랜드에서 0.98..1.02 = ~ (-0.02, +0.02). 그래서 모든 번호의 로그를 사용하십시오. groupby를하기 전에 버킷을 버블 링해야합니다.
코드를 원한다면 모서리 케이스를 테스트하는 숫자가 더 많은 (랜덤 시드 된) 재현 가능한 예제를 제공하십시오.
매우 좋습니다! 동일한 결과를 얻으려면 두 번째 코드 블록 대신'res = [[el.g for el for g] for key, g '를 groupby (map (MyValue, values))]'라고 쓰십시오. – hvwaldow
굉장한, 매번 마법의 방법을 잊어 버려. 그것을 사용할거야. – struckoff