Невозможно использовать кортеж в качестве словарного ключа? - PullRequest
5 голосов
/ 10 ноября 2011

Код немного сложный, извините. Пожалуйста, обратите внимание на функцию parallel_p. Хотя sign является кортежем, Python жалуется:

if sign in hashtable и дает TypeError. Почему sign numpy.ndarray, а не кортеж? Я создал его как кортеж.

p_dist = dict()

def parallel_prog(hashtable):
    def wrapper(func):
        if parallel_programming:
            @wraps(func)
            def parallel_p(*args, **kwargs):
                sign = tuple(args) 
                print type(sign)
                if sign in hashtable:
                    r = hashtable[sign] # hit.
                    return r
                r = func(*args, **kwargs)
                hashtable[tuple(sign)] = r # register for future hits.
                return r
            return parallel_p
        else:
            return func
    return wrapper


@parallel_prog(p_dist)
def euclidean(a, b, signature=None):

    val = np.sqrt(np.add.reduce((a - b)**2))
    return val

В ТЕСТНОМ МОДУЛЕ

class similartyTest(unittest.TestCase):

    def setUp(self):
        self.t = np.array([1,2,3,4])
        self.t1 = np.array([0, 0, 0, 0])
        self.t2 = np.array([4,3,2,1])
        self.h1 = [1,0,0,1,1]
        self.h2 = [1,1,1,1,1]

    def test_euclidean(self):
        self.failUnless(euclidean(self.t, self.t) == 0)
        self.failUnless(euclidean(self.t, self.t1) == sqrt(30))

ВЫВОД:

<type 'tuple'>`

TypeError: unhashable type: 'numpy.ndarray`

Ответы [ 2 ]

14 голосов
/ 10 ноября 2011

Не каждый кортеж является хэшируемым. Кортеж, содержащий не хэшируемые элементы, не является хэшируемым:

>>> x = ([], [])
>>> hash(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Ваш кортеж, очевидно, содержит массив NumPy, который настолько далек от того, чтобы его можно было хэшировать, чем может быть тип.

1 голос
/ 30 марта 2017

Кортежи могут быть хэшируемыми, только если они содержат хешируемые ссылки.

t1 = (7, 'A')
t2 = (7, 'A', {1, 2, 3})

t1 - хэшируемый, а t2 - нет.

Ссылка ниже дает более подробное объяснение: https://www.quora.com/Are-tuples-hashable-in-Python/answer/Luciano-Ramalho?srid=T4aW

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...