Список как ключ для словаря

У меня есть несколько списков кортежей, например

[([1, 2, 3, 4], 2), ([5, 6, 7], 3)] 

что я хотел бы иметь ключи от словаря (поэтому каждый ключ в моем словаре будет списком кортежей).

К сожалению, согласно unhashable type: list я получаю ( unhashable type: list ), кажется, что python не любит списки хэширования. Все элементы в моем списке кортежей – ints (если это имеет значение). Любые предложения о том, что я могу сделать? Благодаря!

  • Создание пустоты в Python для этих спецификаций?
  • Разбить список кортежей в под-списки одного и того же кортежа
  • python os.environ, os.putenv, / usr / bin / env
  • Почему я не могу вызвать методы непосредственно для объектов int?
  • Получить вчерашнюю дату в Python, DST-safe
  • Код выхода Pycharm 0
  • Правильный способ перезагрузки модуля python с консоли
  • построить словарь для ключа поиска по значению
  • 5 Solutions collect form web for “Список как ключ для словаря”

     >>> def nested_lists_to_tuples(ls): return tuple(nested_lists_to_tuples(l) if isinstance(l, (list, tuple)) else l for l in ls) >>> nested_lists_to_tuples([([1,2,3,4],2),([5,6,7],3)]) (((1, 2, 3, 4), 2), ((5, 6, 7), 3)) 

    Затем просто используйте это возвращаемое значение в качестве ключа. Обратите внимание, что я сделал это так, чтобы вы могли поддерживать еще более глубоко вложенные миксы кортежей и списков, такие как [([1,(2, [3, 4, [5, 6, (7, 8)]]), 3, 4], 2), ([5, 6, 7], 3)] :

     >>> nested_lists_to_tuples([([1, (2, [3, 4, [5, 6, (7, 8)]]), 3, 4], 2), ([5, 6, 7], 3)]) (((1, (2, (3, 4, (5, 6, (7, 8)))), 3, 4), 2), ((5, 6, 7), 3)) 

    Однако может быть и более простой способ сделать это.

    Вместо этого используйте кортежи.

     >>> dict((tuple(x[0]), x[1]) for x in [([1,2,3,4],2),([5,6,7],3)]) {(5, 6, 7): 3, (1, 2, 3, 4): 2} 

    Преобразуйте списки в кортежи:

     dict((tuple(a), b) for a,b in [([1,2,3,4],2),([5,6,7],3)]) 

    Если вы используете Python> = 2.7, вы можете использовать dict-comprehensions:

     {tuple(a): b for a,b in [([1,2,3,4],2),([5,6,7],3)]} 

    Использовать repr

     class A: pass import time # A and time as heterogenous elements, only to show the generality of my solution li_li = [ [([1,2,3,4],2),([5,6,7],3)] , [([10,20,3],2), ([5,6,77],3)] , [([1,2,3,4],2),([5,6,time,7],3),([875,12], ['jk',78], A, (100,23),'zuum')] ] didi = {} for i,li in enumerate(li_li): didi[repr(li)] = i print 'dictionary didi:' for k,v in didi.iteritems(): print k,' ',v print '----------------------------------' print didi[repr([([1+1+1+1+1+5, 200000/10000, 3],2),([5,8-2,7*11],3) ])] 

    результат

     dictionary didi: [([1, 2, 3, 4], 2), ([5, 6, <module 'time' (built-in)>, 7], 3), ([875, 12], ['jk', 78], <class __main__.A at 0x011CFC70>, (100, 23), 'zuum')] 2 [([1, 2, 3, 4], 2), ([5, 6, 7], 3)] 0 [([10, 20, 3], 2), ([5, 6, 77], 3)] 1 ---------------------------------- 1 

    Вы должны преобразовать списки в кортежи

    Python - лучший язык программирования в мире.