将Python列表值映射到字典值

时间:2016-10-10 09:28:50

标签: 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]

非常感谢任何协助。

4 个答案:

答案 0 :(得分:7)

您的问题是您没有在dataRows中放置子词典。修复将是这样的:

toString()

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

更新:

您还可以使用collections.defaultdict()来避免在每次迭代中将dict分配给dataRows。

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

答案 2 :(得分: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}}

答案 3 :(得分:0)

这是一个只有一个显式循环的Python 3解决方案:

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