转换字典格式

时间:2014-06-24 11:05:44

标签: python dictionary

我有一个下一种格式的字典:

a = {'file': {'x': [1, 2, 3, 4], 'y': [23, 134, 571, 13]}, 
     'file2': {'x': [1, 2, 3, 5], 'y': [123, 215, 21, 123]}}

是否可以以这种格式转换此字典(此处键是所有x之间的联合):

{'1': {'file': 23, 'file2': 123}, '2': {'file': '134', 'file2': 215}, ..., 
 '4': {'file': 13, 'file2': '-'}, '5': {'file': '-', 'file2': '123'}}

我无法弄明白该怎么做。

2 个答案:

答案 0 :(得分:5)

是的,当然有可能。我认为你想要的是:

interim = {k: {x: y for x, y in zip(v['x'], v['y'])} for k, v in a.items()}

创建一个将'x'映射到'y'的字典:

{'file2': {1: 123, 2: 215, 3: 21, 5: 123}, 
 'file': {1: 23, 2: 134, 3: 571, 4: 13}}

然后:

out_keys = set().union(*interim.values())

为输出创建一组键:

set([1, 2, 3, 4, 5])

最后:

output = {k: {k1: v1.get(k, "-") for k1, v1 in interim.items()} for k in keys}

创建输出格式:

{1: {'file2': 123, 'file': 23}, 
 2: {'file2': 215, 'file': 134}, 
 3: {'file2': 21, 'file': 571}, 
 4: {'file2': '-', 'file': 13}, 
 5: {'file2': 123, 'file': '-'}}

这是灵活的,可以处理任意数量的'file' s,'x''y'。请注意,如果zipx'的长度不同,'y'将截断为较短的任何一个。

答案 1 :(得分:1)

这是一个单行,可以这么说:

In [1]: %paste
a = {'file': {'x': [1, 2, 3, 4], 'y': [23, 134, 571, 13]}, 
     'file2': {'x': [1, 2, 3, 5], 'y': [123, 215, 21, 123]}}

## -- End pasted text --

In [2]: {x: {fkey: 
    ..:         ([y for _, y in zip(fval['x'], fval['y']) if _ == x] or ['-'])[0]
    ..:      for fkey, fval in a.items()}
    ..:  for x in set().union(*[fval['x'] for fval in a.values()])}
Out[2]: 
{1: {'file2': 123, 'file': 23},
 2: {'file2': 215, 'file': 134},
 3: {'file2': 21, 'file': 571},
 4: {'file2': '-', 'file': 13},
 5: {'file2': 123, 'file': '-'}}

基本上它等同于jonsharpe的答案,虽然它没有创建一个中间字典。