Python 字典:改变嵌套顺序
我有一个字典,里面有300对键值对。每个键都是整数,而值则是包含三个键值对的字典。这些内部字典的键是一样的,但值却不同。整体结构大概是这样的:
nested_dicts =
{1: {'name1':88.4,
'name2':22.1,
'name3':115.7},
2: {'name1':89.4,
'name2':23.7,
'name3':117.9}
...
300:{'name1':110.1,
'name2':36.6,
'name3':122.4}
}
如果从上面的例子中还不太明白这个数据结构,嵌套字典应该大致长这样:
better_dict =
{'name1': [88.4, 89.4, ..., 110.1],
'name2': [22.1, 23.7, ..., 36.6],
'name3': [115.7, 117.9, ..., 122.4]}
所以,我想把这个嵌套字典转换成一个更好的字典。
我在实现这个转换时遇到了一些困难。我已经接近成功了,但我在确保结果列表的顺序正确方面遇到了麻烦。也就是说,列表中的值的顺序应该和原始嵌套字典的外部字典的键对应。此外,我的代码使用了for循环,但我觉得这其实可以用生成器或列表推导式来更自然地实现。任何帮助都会很感激。
2 个回答
4
在你把输入的字典调整成下面这个样子之后:
>>> nested_dicts
{0: {'name2': 22.1, 'name3': 115.7, 'name1': 88.4},
1: {'name2': 23.7, 'name3': 117.9, 'name1': 89.4},
2: {'name2': 36.6, 'name3': 122.4, 'name1': 110.1}}
>>> for i in sorted(nested_dicts):
for k, v in nested_dicts[i].items():
if k not in n:
n[k] = [None] * len(nested_dicts)
n[k][i] = v
>>> n
defaultdict(<class 'list'>, {'name2': [22.1, 23.7, 36.6],
'name3': [115.7, 117.9, 122.4], 'name1': [88.4, 89.4, 110.1]})
我得提醒你,原来的结构其实只需要是一个字典的列表,因为对键的要求有些限制。
补充说明:如果你想保持键的顺序,那么你原来的 nested_dict
里需要有正确的索引。也就是说,索引需要从0开始,并且是连续的。
3
在python2.7及以上版本中
{n:[nested_dicts[i][n] for i in range(1,301)] for n in ["name1","name2","name3"]}
对于python2.6版本
dict((n, [nested_dicts[i][n] for i in range(1,301)]) for n in ["name1","name2","name3"])
请注意,你的列表中的位置是从0开始编号的,而不是从1开始