/ / Hashing tuple в Python, където има значение? - питън

Хейсинг на плит в "Питон", където има значение? - питън

Аз имам:

tuple1 = token1, token2
tuple2 = token2, token1
for tuple in [tuple1, tuple2]:
if tuple in dict:
dict[tuple] += 1
else:
dict[tuple] = 1

Въпреки това и двете на nuple 1 и tuple2 получават едни и същи стойности. Какъв е начинът да се каже група от 2 неща, които имат значение?

Отговори:

20 за отговор № 1

Поръчката се взима предвид при хеширане:

>>> 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

Имайте предвид, че поради хеш сблъсъци, този dict е вероятно да бъде по-малко ефективен от друг dict, където няма hash сблъсквания :)


7 за отговор № 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

0 за отговор № 3

Изглежда, че сте публикували един пример на тялото на цикъл. Може ли да ви предложа да използвате collections.Counter за това, което се опитвате да направите, което прави точно това, което искате, но в един ред:

counter = (collections.Counter(myListOfTuples) +
collections.Counter([j,i for i,j in myListOfTuples]))