2015-05-12 161 views
1

假设我有一个列表X = [[[2, 2]], [[2, 5], [3, 1]], [[3, 3], [4, 4], [1, 6]], [[1, 1], [4, 0]], [[]]]。我想将X转换成像这样的字典字典。将列表列表转换为字典词典(Python)

G = {0: {2: 2}, 
    1: {2: 5, 3: 1}, 
    2: {3: 3, 4: 4, 1: 6}, 
    3: {1: 1, 4: 0}, 
    4: {} 
    } 

到目前为止,我有

for i in range(0,len(X)): 
    for j in range(0, len(X[i])): 
     G[i] = {X[i][j][0]: X[i][j][1]} 

产生

{0: {2: 2}} 
{0: {2: 2}, 1: {2: 5}} 
{0: {2: 2}, 1: {3: 1}} 
{0: {2: 2}, 1: {3: 1}, 2: {3: 3}} 
{0: {2: 2}, 1: {3: 1}, 2: {4: 4}} 
{0: {2: 2}, 1: {3: 1}, 2: {1: 6}} 
{0: {2: 2}, 1: {3: 1}, 2: {1: 6}, 3: {1: 1}} 
{0: {2: 2}, 1: {3: 1}, 2: {1: 6}, 3: {4: 0}} 
Traceback (most recent call last): 
G[i] = {X[i][j][0]: X[i][j][1]} 
IndexError: list index out of range 

首先,它仅更新字典,而不是追加新的密钥,第二它没有我在我的空单。
有什么建议吗?

回答

3

如果你使用的是Python 2.7,你可以使用字典理解。

X = [[[2, 2]], [[2, 5], [3, 1]], [[3, 3], [4, 4], [1, 6]], [[1, 1], [4, 0]], [[]]] 

d = {k: dict(v) if v[0] else {} for k, v in enumerate(X)} 

有人有一个很好的答案,但他们删除了它,他们也采用了字典的理解,但处理的空列表更好的(我认为)。它就像这样

d = {k: dict(item for item in v if item) for k, v in enumerate(X)} 
+0

不错。甚至可以在Python 3中工作。我真的需要花更多时间在列表和字典解析上。谢谢。 – sebastian

0

你分配G应该是:

G[i][X[i][j][0]] = X[i][j][1] 

你还需要内部循环之前初始化的G每个项目:

G[i] = {}