【问题标题】:Python dictionaries: changing the order of nestingPython 字典:改变嵌套顺序
【发布时间】:2010-07-02 15:40:37
【问题描述】:

我有一个字典,有 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]}

所以,我想做一个从 nested_dicts 到 better_dict 的转换。

我无法解决这个问题。我已经接近了,但我的麻烦来自试图弄清楚如何确保结果列表的顺序正确。即列表中值的顺序应该与原始nested_dict的外层字典中的键对应。此外,我的代码使用 for 循环,但我觉得这是生成器/列表推导的自然应用。任何帮助,将不胜感激。

【问题讨论】:

    标签: python sorting list-comprehension dictionary


    【解决方案1】:

    将您的输入字典调整为:

    >>> 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]})
    

    我必须注意,鉴于键的限制,您的原始结构只需要是一个字典列表。

    ETA:您保留密钥顺序的请求需要在您的原始nested_dict 中建立适当的索引。也就是需要有一个从0开始的连续序列。

    【讨论】:

    • 您仍然需要对字典进行排序以按正确的顺序附加元素。否则不保证订单稳定。
    • 是的,这几乎是我迄今为止所拥有的代码(尽管 defaultdict 是一个不错的选择)。我想我没有说清楚列表中值的顺序很重要。它应该对应于原始nested_dict的外部字典中的键。这就是我的麻烦所在。
    • 从 0 开始的键顺序是相当容易做到的。我只是无法在正确的地方进行排序。
    【解决方案2】:

    在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 开始

    【讨论】:

    • 这很好用。在我之前尝试使用生成器/列表推导时,我没想过只是将名称列表放入生成器中,这对我自己来说非常困难。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多