代码之家  ›  专栏  ›  技术社区  ›  Cybernetic

使用键列表在Python中设置字典-不可修复的错误

  •  0
  • Cybernetic  · 技术社区  · 10 年前

    我试图通过使用列表中的键来在python中对字典进行子集。以下是我所拥有的:

    sub_set = dict((k, my_dict[k]) for k in tuple(my_list))
    

    但我得到了错误:

    TypeError: unhashable type: 'list'
    

    但我认为首先将其转换为元组可以解决这个问题。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Sylvain Leroux    10 年前

    列表是不可更改的。元组是可散列的。两者都是可迭代的。

    我认为首先将其转换为元组可以解决这个问题。

    从你的例子中假设 my_list 是一个“列表”,可能您没有将 tuple() 在正确的地方打电话:

    sub_set = dict((tuple(k), my_dict[tuple(k)]) for k in my_list)
    #               ^^^^^^^^          ^^^^^^^^
    #      convert the list k to a tuple
    

    或者更好:

    sub_set = dict((k, my_dict[k]) for k in map(tuple,my_list))
    #                                       ^^^^^^^^^^^^^^^^^^
    #                                   map *inner* lists to tuples
    

    参见:

    >>> my_dict = {(1, 2): "1;2", (2, 3): "2;3", (3, 4): "3;4" }
    >>> my_list = [[1, 2], [2, 3]]
    >>> sub_set = dict((k, my_dict[k]) for k in map(tuple,my_list))
    >>> sub_set
    {(1, 2): '1;2', (2, 3): '2;3'}
    
        2
  •  0
  •   André Laszlo    10 年前

    对我有用,里面有什么 my_list ?

    In [2]: my_dict = {'foo': 1, 'bar': 2, 'baz': 3}
    In [3]: my_list = ['foo', 'baz']
    In [4]: sub_set = dict((k, my_dict[k]) for k in tuple(my_list))
    In [5]: sub_set
    Out[5]: {'baz': 3, 'foo': 1}