2017-05-18 4 views
-1

Il semble, pour une raison que dict ne peut pas avoir une clé non double qui est BitArray() ex .:Bitarray de hachage? Compter

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

print ba 

{BitArray ('11011'): 1, BitArray (» 11011 '): 1, bitarray (' 11011 '): 1, bitarray (' 01111 '): 1, bitarray (' 11110 '): 1, bitarray (' 11110 '): 1, bitarray (' 01111 '): 1 , BitArray ('01111'): 1, BitArray ('11110'): 1, BitArray ('11110'): 1}

Vous pouvez clairement voir que deux exemplaires sont stockés sous forme de différentes clés (fe deux premiers éléments) !! ce qui est bizarre. Quelle pourrait être la raison. Mon but est simplement de compter le nombre de fois qu'un modèle binaire apparaît, et bien sûr que Dict est parfait pour cela, mais il semble que bitarray() soit opaque pour l'algorithme de hachage. btw .. je dois utiliser bitarray(), car je fais 10000 bits + motifs.

Toute autre idée de moyen efficace de compter l'apparition de socques bits ..

+0

Vous ne pouvez pas utiliser de manière significative une BitArray comme une clé dict. Même essayer devrait déclencher une erreur TypeError, mais la classe a un bogue où elle hérite du hachage basé sur l'identité par défaut au lieu d'utiliser PyHash_NotImplemented. – user2357112

Répondre

-1

Je l'ai résolu:

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

ça alors je manque perl no-nonsense autovivification :)

+0

'.tobytes()' produirait un objet beaucoup plus compact pouvant être utilisé comme clé de dictionnaire. Et un 'collections.Counter' serait beaucoup plus facile à utiliser dans cette situation qu'un dictionnaire brut. – jasonharper

1

Cette adresse de réponse votre première confusion concernant les clés de dictionnaire en double et je suppose que vous faites référence à bitarray() du module bitarray, * Je n'ai pas utilisé ce module moi-même.

Dans votre exemple ci-dessus, vous n'êtes pas vraiment obtenir les clés dupliquées de dictionnaire, vous pouvez les voir de cette façon, mais ils sont en double à l'œil nu que, par exemple:

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

Mais x1 ISN « t égal exactement à x2 et donc ils ne sont pas des doublons, ils sont des objets distincts de la classe X:

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

de plus, parce que X classe définit __repr__ qui retourne e e représentation de la chaîne pour ses objets, vous pensez que le dictionnaire d a des clés en double, à nouveau il n'y a pas de clés en double ni les clés de type str; clé de la valeur 1 est X objet et clé de la valeur 2 est un autre objet de X - littéralement deux objets différents avec une seule représentation de chaîne retournée par leur méthode de classe __repr__:

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