将包含列表项的dict扩展为dict对列表

r3r*_*son 12 python dictionary list-comprehension python-2.7 dictionary-comprehension

如果我有一个字典,其中包含一个或多个值中的列表:

data = {
  'a':0,
  'b':1,
  'c':[0, 1, 2],
  'pair':['one','two']
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到一个dict元组列表,pair并且迭代结束c,其他所有元素保持不变?例如

output = [
    ({
        'a':0,
        'b':1,
        'c':0,
        'pair':'one'
    },
    {
        'a':0,
        'b':1,
        'c':0,
        'pair':'two'
    }),
    ({
        'a':0,
        'b':1,
        'c':1,
        'pair':'one'
    },
    ...
]
Run Code Online (Sandbox Code Playgroud)

dav*_*ere 5

好吧,这感觉不是特别优雅,但你可以使用嵌套的for循环或列表理解:

output = []
for i in data['c']:
  output.append(tuple({'a': 0, 'b': 1, 'c': i, 'pair': p} for p in data))
Run Code Online (Sandbox Code Playgroud)

要么

output = [tuple({'a': 0, 'b': 1, 'c': i, 'pair': p} for p in data['pair']) for i in data['c']]
Run Code Online (Sandbox Code Playgroud)

一个更干净的解决方案可能会将组件dict的生成分离为一个函数,如下所示:

def gen_output_dict(c, pair):
  return {'a': 0, 'b': 1, 'c': c, 'pair': pair}

output = []
for i in data['c']:
  output.append(tuple(gen_output_dict(i, p) for p in data['pair']))
Run Code Online (Sandbox Code Playgroud)