2017-05-18 2 views
-1

を数えることはdictのは、() 例:ハッシングビット配列? 「(1、bitarray:

data = {} 
for _ in xrange(10): 
    ba = ...generate repeatable bitarrays ... 
    data[ba] = 1 

print ba 

{bitarray( '11011')bitarrayである非重複キーを持つことができないことを何らかの理由らしいです11011 '):1、ビット配列(' 11011 '):1、ビット配列(' 01111 '):1、ビット配列(' 11110 '):1、ビット配列(' 11110 '):1、ビット配列(' 01111 '):1 、bitarray( '01111'):1、bitarray( '11110'):1、bitarray( '11110'):1}

重複するが異なる鍵(FE最初の2つの要素として格納されていることをはっきりと見ることができます)!!それは奇妙です。理由は何か。 私の目標は、単純にビットパターンが現れる回数を数えることです。もちろん、Dictはこれには完璧ですが、何らかの理由でbitarray()がハッシュアルゴリズムに不透明であるようです。 btw .. bitarray()を使用する必要があります。原因は10000ビット+パターンです。

ビットpattensの発生をカウントする効率的な方法の任意の他のアイデアは...

+0

dictキーしようとしてもTypeErrorが発生するはずですが、クラスにはPyHash_NotImplementedを使用する代わりにデフォルトのIDベースのハッシュを継承するバグがあります。 – user2357112

答えて

-1

私はそれを解決:私はperlのきまじめなautovivificationを欠場:)

+0

'.tobytes()'は辞書キーとしての使用に適したよりコンパクトなオブジェクトを生成します。そして、この状況では 'collections.Counter'は生の辞書よりもずっと使いやすくなります。 – jasonharper

1

この回答アドレス

desc = bitarray(res).to01() 
if desc in data : data[desc] += 1 
else : data[desc] = 1 

おやっを辞書の重複キーに関する最初の混乱と私はbitarray()bitarrayモジュールから参照していると仮定しています。*私はこのモジュールを自分で使っていません。上記のあなたの例では

、例えば、あなたが実際に重複した辞書のキーを取得していない、あなたは彼らにそのように表示される場合がありますが、彼らは唯一の肉眼に重複している:

>>> class X: 
...  def __repr__(self): 
...    return '"X obj"' 
... 
>>> x1 = X() 
>>> x2 = X() 
>>> d = {x1:1, x2:2} 
>>> d 
{"X obj": 2, "X obj": 1} 

しかしx1 ISN Xクラスは番目返す__repr__を定義するため、

>>> x1 == x2 
False 
>>> #same as 
... id(x1) == id(x2) 
False 
>>> #same as 
...x1 is x2 
False 

さらに:彼らはクラスXの異なるオブジェクトをしている、「tは正確x2までに等しく、したがって、それらは重複していませんそのオブジェクトの文字列表現では、辞書dに重複キーがあると考えられますが、重複キーはなく、タイプstrのキーもありません。値1のキーがXオブジェクトであり、値2の鍵はXのもう一つの目的である - そのクラスの__repr__メソッドによって返された単一の文字列表現を持つ、文字通り2つの異なるオブジェクト:あなたは意味のようbitarrayを使用することはできません

>>> # keys are instance of X not strings 
... d 
{"X obj": 2, "X obj": 1}  
>>> d["X obj"] 
KeyError: 'X obj' 
>>>[x1] 
1 
>>>[x2] 
2 
関連する問題