2015-12-14 79 views
1

我的目录列表是如下:转换列表列表字典

list1 = [ [0, 4, 2, 5, 0, 0], 
      [4, 0, 0, 0, 6, 4], 
      [2, 0, 0, 7, 0, 0], 
      [5, 0, 7, 0, 5, 3], 
      [0, 6, 0, 5, 0, 1], 
      [0, 4, 0, 3, 1, 0], 
     ] 

,我想转换成字典以下列方式:

G = {'a' : { 'b':4, 'c':2, 'd':5}, 
    'b': {'a':4,'e': 6,'f':4}, 
    'c':{ 'a':2,'d':7}, 
    'd':{'a':5, 'c':7, 'e':5,'f':3}, 
    'e':{'b':6, 'd':5,'f':1}, 
    'f' :{'b':4, 'd':3,'e':1} 
} 

我有代码下面这样做,但它只是给我一个错误,不可能的类型列表:

list1 = [ [0, 4, 2, 5, 0, 0], 
    [4, 0, 0, 0, 6, 4], 
    [2, 0, 0, 7, 0, 0], 
    [5, 0, 7, 0, 5, 3], 
    [0, 6, 0, 5, 0, 1], 
    [0, 4, 0, 3, 1, 0], 
] 

g=['a','b','c','d', 'e','f'] 
dl = zip(list1, g) 
dict(dl) 
print dl 

错误是:

File "/Users/zakirtatari/Documents/da.py", line 19, in <module> 
     dict(dl) 
    TypeError: unhashable type: 'list' 
+1

显示错误。另外,解释你认为你的代码应该如何工作。 –

+0

这是你唯一关心的例子吗?是否有一个更一般的情况,你有超过26行/列,可能会用完字母? – Reti43

回答

4

如果你不在乎关于与零值的钥匙,这应该做的伎俩:

from string import ascii_lowercase as letters 
dict(zip(letters, [dict(zip(letters, L)) for L in list1])) 

如果您想筛选出这样的键,你可以这样做:

dict(zip(letters, 
     [dict((k, v) for k, v in zip(letters, L) if v) for L in list1])) 
1

下面的解决方案是一种丑陋的(并且可以通过枚举和zip来美化),但似乎做你想要它做的事情:

alphabet = "abcdefghijklmnopqrstuvwxyz" 
list1 = [[0,4,2,5,0], [4, 0, 0, 0, 6]] 

g = {} 
for idx in range(len(list1)): 
    g[alphabet[idx]] = {} 
    for idx_2 in range(len(list1[idx])): 
     if list1[idx][idx_2] != 0: 
      g[alphabet[idx]][alphabet[idx_2]] = list1[idx][idx_2] 
1

我不知道我会在实践中做到这一点的一个班轮,但这里是一个都一样,使用字典理解:

{key: {key2: value for key2, value in zip(g, row) if value != 0} 
for key, row in zip(g, list1)} 
1

首先,我会写两个功能,一是转换列表到字典中,从ascii_lowercase中获取密钥,另一个通过字典并过滤出值为零的键值对。

from string import ascii_lowercase 

def list_to_dict(in_list): 
    return dict([(k, v) for k, v in zip(ascii_lowercase, in_list)]) 

def filter_dict(in_dict): 
    return dict([(k, v) for k, v in in_dict.items() if v != 0]) 

然后所有的逻辑适合单个列表迭代器声明:

list1 = list_to_dict([filter_dict(list_to_dict(x)) for x in list1 ]) 

首先,通过每“行”,并把他们变成字典,然后筛选上是相等值的字典零。

对字典列表运行相同的函数,并将它们转换为键值对。如果要保留元素的顺序,您可能想使用OrderedDict