【问题标题】:Unable to use a tuple as a dictionary key?无法使用元组作为字典键?
【发布时间】:2011-12-25 17:30:34
【问题描述】:

代码有点复杂,抱歉。请关注parallel_p 功能。虽然sign 是一个元组,但 Python 抱怨:

if sign in hashtable 并给出TypeError。为什么signnumpy.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`

【问题讨论】:

    标签: python typeerror hashable


    【解决方案1】:

    并非每个元组都是可散列的。包含不可散列项的元组不可散列:

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

    您的元组显然包含一个 NumPy 数组,它远不是一种可散列的类型。

    【讨论】:

    • @Thorn:您的评论不清楚。请提出另一个问题以获得更好的反馈。
    【解决方案2】:

    元组只有在持有可散列引用时才可散列。

    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

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 2010-11-28
      • 2012-02-20
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      相关资源
      最近更新 更多