我有一个下一种格式的字典:
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'}}
我无法弄明白该怎么做。
答案 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'
。请注意,如果zip
和x'
的长度不同,'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的答案,虽然它没有创建一个中间字典。