2016-10-10 99 views
2

我行的列表...映射Python列表值字典值

rows = [2, 21]

和數據的字典...

data = {'x': [46, 35], 'y': [20, 30]}

我想構建第二個詞典,dataRows,鍵入由看起來像這樣的行...

dataRows = {2: {'x': 46, 'y': 20}, 21: {'x': 35, 'y': 30}}

我嘗試下面的代碼,但dataRows值始終是相同的(在循環最後一個值):

for i, row in enumerate(rows): 
    for key, value in data.items(): 
     dataRows[row] = value[i] 

任何援助將不勝感激。

+0

什麼是'data'和'rows'之間的連接?因爲如果您要按插入順序跳轉來連接它們,您將遇到麻煩,因爲字典會按哈希值對項目進行排序。 –

+0

行的位置對應於數據字典中值的位置。換句話說,如果行= 2(位置= 0),則其相應的值在數據['x']中的x = 46(位置0)並且數據['y']中的y = 20(位置0)。 – AndroidNoobie

回答

7

你的問題是,你不把數據行中的子字典。此修復程序是這樣的:

for i, row in enumerate(rows): 
    dataRows[row] = {} 
    for key, value in data.items(): 
     dataRows[row][key] = value[i] 
+2

*完全相同的代碼(包括空格)我放在我的答案中(因爲您先發布而未發佈)。 – EvilTak

+0

啊,非常感謝!這是有道理的。 – AndroidNoobie

+1

@AndroidNoobie另外,請注意使用collections.defaultdict(),它允許您避免爲每次迭代分配字典(下面的文章) – seokhoonlee

2

下面的代碼工作對我來說:

rows = [2, 21] 

data = {'x': [46, 35], 'y': [20, 30]} 

dataRows = {} 

for i, row in enumerate(rows): 
    dataRows[row] = {} 
    dataRows[row]['x'] = data['x'][i] 
    dataRows[row]['y'] = data['y'][i] 

print dataRows 

UPDATE:

您還可以使用collections.defaultdict(),以避免在每次迭代分配字典據行。

import collections 

rows = [2, 21] 

data = {'x': [46, 35], 'y': [20, 30]} 

dataRows = collections.defaultdict(dict) 

for i, row in enumerate(rows): 
    for key, value in data.items(): 
    dataRows[row][key] = value[i] 

print dataRows 
0

在線路:

>>> {r: {k: v[i] for k, v in data.items()} for i, r in enumerate(rows)} 
{2: {'x': 46, 'y': 20}, 21: {'x': 35, 'y': 30}} 
0

下面是一個Python 3的解決方案只有一個明確的循環:

{r: dict(zip(data.keys(), d)) for r, *d in zip(rows, *data.values())}