我有:
tuple1 = token1, token2
tuple2 = token2, token1
for tuple in [tuple1, tuple2]:
if tuple in dict:
dict[tuple] += 1
else:
dict[tuple] = 1
然而,元组1和元组2都获得了相同的计数。有什么方法可以哈希一组两个事物,使其顺序有所区别?
我有:
tuple1 = token1, token2
tuple2 = token2, token1
for tuple in [tuple1, tuple2]:
if tuple in dict:
dict[tuple] += 1
else:
dict[tuple] = 1
然而,元组1和元组2都获得了相同的计数。有什么方法可以哈希一组两个事物,使其顺序有所区别?
在哈希时考虑顺序:
>>> hash((1,2))
1299869600
>>> hash((2,1))
1499606158
__eq__
方法定义):>>> t1 = 'a',hash('a')
>>> [hash(x) for x in t1] #both elements in the tuple have same hash value since `int` hash to themselves in cpython
[-468864544, -468864544]
>>> t2 = hash('a'),'a'
>>> hash(t1)
1486610051
>>> hash(t2)
1486610051
>>> d = {t1:1,t2:2} #This is OK. dict's don't fail when there is a hash collision
>>> d
{('a', -468864544): 1, (-468864544, 'a'): 2}
>>> d[t1]+=7
>>> d[t1]
8
>>> d[t1]+=7
>>> d[t1]
15
>>> d[t2] #didn't touch d[t2] as expected.
2
token1,token2
和token2,token1
的计数。如果你不这样做,计数就不会保持同步:In [16]: import collections
In [17]: d = collections.defaultdict(int)
In [18]: d[1,2] += 1
In [19]: d[1,2]
Out[19]: 1
In [20]: d[2,1]
Out[20]: 0
d[(1,2)]
而不是d[1,2]
,尽管它们是等价的... - mgilson看起来你已经发布了一个循环体的实例。我可以建议你使用 collections.Counter
来完成你想要做的事情,它可以在一行代码中实现你想要的功能:
counter = (collections.Counter(myListOfTuples) +
collections.Counter([j,i for i,j in myListOfTuples]))
token1
和token2
本身的hash()
值不同。 - Silas Ray__hash__
使得顺序无关紧要...但即使如此,根据__eq__
的实现方式,你的dict
仍然可能正常运行(尽管由于哈希冲突而非常低效)。 - mgilson