如何更改要用作字典键的列表

时间:2014-11-16 13:27:02

标签: python list dictionary

我有一个列表列表,每个列表中包含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 s。 它适用于简单列表(如[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中,它们不会被更改。我只需要一些方法将它们传递给另一个模块来提取它们。

2 个答案:

答案 0 :(得分: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 :(得分:1)

只使用元组:

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

输出:

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