2016-10-28 9 views
0

私は数字のリストを持っており、それをグループ化する必要があります。 itertools.grouby仕事完全に同じ番号のシーケンスのために私は閾値と(2-3%)の番号の同じ動作を必要とするPython groupby threshold

E.X:lst = [1, 500, 19885, 19886, 19895, 90000000] と私は

[[1], [500], [19885, 19886, 19895], [90000000]]を期待するが、あなたは私に何かを提案することはできますか?

答えて

1

:これは「そうグループ内の「参照」としてあなたを最初の値を維持すること

for key, group in groupby(map(MyValue, values)): 
    group_values = [el.val for el in group] 

注:

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%まで上がる可能性があります。

これは、あなたが示されているデータで問題ないはず、異なるグループが大幅に離れているし、それが近いグループとの信頼性が文句を言いません。

+0

非常にいいです!同等の結果を得るには、2番目のコードブロックではなく、 'res = [[el.g for el for g for key]、gをgroupby(map(MyValue、values))]'と書く。 – hvwaldow

+0

素晴らしい、毎回魔法を忘れる。それを使うつもりだ – struckoff

0

バケット。あらかじめブレークを手動で調整する必要があります。あなたは、事前に並べ替えることができますか?それはそれをより簡単にするでしょう。

実際には、logを使用すると、乗法的なしきい値は一定のしきい値に変わります。 log-land〜0.98..1.02 =(-0.02、+0.02)。 したがって、すべての番号のログを使用してください。 あなたはまだgroupbyを実行する前にそれらをバケットする必要があります。

あなたがコードをしたい場合は、私たちのコーナーケースをテスト以上の数字を持っている優れた(ランダムシードの)再現性の例を与えます。

あなたはまだ groupbyを使用しますが、カスタムのコンパレータを使用することができます
+0

バケツはどういう意味ですか?注文が必要なので実際に私はそれを並べ替えることはできません。 @Bakuriuが示されたものと同様 - – struckoff

+0

「バケツ」「はグループ化の目的のために、ビンに範囲を分割し、量子化値を使用する」を意味します。ちょうどヒストグラムのように。 – smci