2016-10-28 6 views
0

숫자 목록이있어서 그룹화해야합니다. itertools.grouby 작업을 완벽하게 동일한 숫자의 시퀀스하지만 난 임계 값 (2-3 %)의 숫자와 동일한 동작을 필요파이썬 groupby 임계 값

E.X : lst = [1, 500, 19885, 19886, 19895, 90000000] 내가

[[1], [500], [19885, 19886, 19895], [90000000]]을 기대 당신이 나에게 무언가를 제안 할 수 있습니다?

답변

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 %까지 올라갈 수 있습니다.

서로 다른 그룹이 상당히 구별되었지만 가까운 그룹에서 신뢰할 수없는 데이터로 표시해야합니다.

+0

매우 좋습니다! 동일한 결과를 얻으려면 두 번째 코드 블록 대신'res = [[el.g for el for g] for key, g '를 groupby (map (MyValue, values))]'라고 쓰십시오. – hvwaldow

+0

굉장한, 매번 마법의 방법을 잊어 버려. 그것을 사용할거야. – struckoff

0

버켓. 미리 휴식 시간을 수동으로 조정해야합니다. 사전에 분류 할 수 있습니까? 그렇게하면 더 쉬울 것입니다.

실제로 log를 사용하면 곱셈 임계 값이 상수 임계 값으로 바뀝니다. 로그 랜드에서 0.98..1.02 = ~ (-0.02, +0.02). 그래서 모든 번호의 로그를 사용하십시오. groupby를하기 전에 버킷을 버블 링해야합니다.

코드를 원한다면 모서리 케이스를 테스트하는 숫자가 더 많은 (랜덤 시드 된) 재현 가능한 예제를 제공하십시오.

+0

버킷에 대해 무슨 뜻입니까? 주문이 필요하기 때문에 실제로는 정렬 할 수 없습니다. – struckoff

+0

'버킷'은 '범위를 범위로 나누고 그룹화 할 목적으로 양자화 된 값을 사용하는 것을 의미합니다.'- @Bakuriu가 보여준 것과 유사합니다. 히스토그램처럼. – smci