2014-11-16 5 views
-1

У меня есть список списков с 4 элементами в каждом из них.Как изменить список, который будет использоваться в качестве словарного ключа

LoL=[[1,1,1,1],[4,2,3,[1,3]],[4,5,3,[0,4]]] 

4-я элементы могут быть список из двух частей, как [0,4] в [4,5,3,[0,4]].

мне нужно использовать его элементы в качестве ключей для словаря,

Pseudo code: 
dic = { [1,1,1,1]:'a',[4,2,3,[1,3]]:'b',[4,5,3,[0,4]]:'c' } 

так пытался изменить их tuple с. Это работает для простых списков (например, [1,1,1,1]), но для тех, содержащих другой список (например, [4,5,3,[0,4]]) он выдает ошибку:

dic[tuple([1,1,1,1])]=['bla','blah'] 
print dic 
{(1, 1, 1, 1): ['bla', 'blah']} 

dic[tuple([4, 2, 3, [1, 3]])]=['blablah'] 
TypeError: unhashable type: 'list' 

Мне нужно повторно использовать ключи, как позже списки. Поэтому попытка изменить элементы LoL на строки (например, с использованием repr()) не является вариантом!

Редактировать: Я знаю, почему списки не могут использоваться в качестве ключей словаря. Здесь они не изменяются в то время как в dic. Мне просто нужно каким-то образом передать их другому модулю, чтобы извлечь их.

+0

Я прочитал, что, я знаю, почему! и как кортежи не решили мою проблему. – Angel

+0

LoL передается моей программе, и я не могу ее изменить. Он вводится в мой модуль. – Angel

+1

@vaultah: Angel _knows_ они не могут использовать списки в качестве ключей, но хотят знать, как обойти это, что ваши ссылки не полностью адресуют. –

ответ

2

Просто конвертировать вложенные списки вложенных кортежей. Вот быстрая демонстрация. Это не идеально, но это работает.

#! /usr/bin/env python 

LoL = [[1,1,1,1],[4,2,3,[1,3]],[4,5,3,[0,4]]] 

def nested_list_to_tuple(nlist): 
    return tuple([nested_list_to_tuple(i) if isinstance(i, list) else i for i in nlist]) 

ToT = nested_list_to_tuple(LoL) 

print ToT 

выход

((1, 1, 1, 1), (4, 2, 3, (1, 3)), (4, 5, 3, (0, 4))) 
1

Просто используйте кортежи:

a = {} 
a[(4, 2, 3, (1, 3))] = ['blablah'] 
print(a) 

Выход:

{(4, 2, 3, (1, 3)): ['blablah']} 
+0

Значения LoL передаются моему модулю. И я не могу их изменить. – Angel

+1

@ Ангел. Вы можете предобработки вход кортежа '>>> л [1, 2, 4, (3, 4)] >>> Защиту convert_to_tuple (л): \t для г в диапазоне (LEN (л)): \t \t, если isinstance (л [я], список): \t \t \t л [я] = кортеж (л [я]) \t возврата кортежа (л) >>> convert_to_tuple (л) (1, 2, 4, (3, 4)) ' – Netro

Смежные вопросы