0

我很难弄清楚如何设置一个sort()函数来处理复杂的数据结构。

这是数据:

{
    "GROUP-A": {
        "key-A1": {
            "GROUP-B": {
                "key-B1": {
                    "GROUP-C": {
                        "key-C1": 100,
                        "key-C2": 850,
                        "key-C3": 50
                    }
                },
                "key-B2": {
                    "GROUP-C": {
                        "key-C1": 700,
                        "key-C2": 1100,
                        "key-C3": 500
                    }
                },
                "key-B3": {
                    "GROUP-C": {
                        "key-C1": 150,
                        "key-C2": 300,
                        "key-C3": 450
                    }
                }
            }
        },
        "key-A2": {
            "GROUP-B": {
                "key-B1": {
                    "GROUP-C": {
                        "key-C1": 0,
                        "key-C2": 0,
                        "key-C3": 0
                    }
                },
                "key-B2": {
                    "GROUP-C": {
                        "key-C1": 50,
                        "key-C2": 150,
                        "key-C3": 250
                    }
                },
                "key-B3": {
                    "GROUP-C": {
                        "key-C1": 150,
                        "key-C2": 50,
                        "key-C3": 200
                    }
                }
            }
        },
        "key-A3": {
            "GROUP-B": {
                "key-B1": {
                    "GROUP-C": {
                        "key-C1": 100000,
                        "key-C2": 0,
                        "key-C3": 0
                    }
                },
                "key-B2": {
                    "GROUP-C": {
                        "key-C1": 0,
                        "key-C2": 0,
                        "key-C3": 0
                    }
                },
                "key-B3": {
                    "GROUP-C": {
                        "key-C1": 0,
                        "key-C2": 0,
                        "key-C3": 0
                    }
                }
            }
        }
    }
}

还要考虑我有多个key-Ax字典。

我要返回的是key-A按 in 中的值排序的类型的 dict 列表,key-C但不更改该键内的数据结构。

例如,使用上面提供的数据,我希望看到:

[{"key-A3":{..}},{"key-A1":{..}},{"key-A2":{..}}]

这是一个单一sort()功能可以实现的,还是太复杂了?

可能是这种类型的东西:

filtered = sorted(data["GROUP-A"].items(), key= lambda kv: (??????))

我一直在修补 lambda 函数,但我无法按预期工作。

如果可以的话,请您解释一下所涉及的步骤吗?我会死去理解你如何将问题分解成更小的部分......以及它背后的推理。

谢谢!

编辑:如果您想尝试一下,这里有一个在线 python 编辑器的链接http://repl.it/MDY/1

4

1 回答 1

1

您可以将多个列表推导链接在一起,以遍历字典的各个层。

filtered = sorted(data["GROUP-A"].items(), key= lambda kv: max(value for group_b in kv[1].itervalues() for key_b in group_b.itervalues() for group_c in key_b.itervalues() for value in group_c.itervalues()))
print filtered

结果:

[
    ('key-A2', {...}), 
    ('key-A1', {...}), 
    ('key-A3', {...})
]

reverse=True(如果您希望项目从大到小排序,请使用关键字参数)

以几行为代价,制作一个更具可读性的辅助函数可能会更好。

def get_biggest_c_value(key_a):
    values = []
    for group_b in key_a.itervalues():
        for key_b in group_b.itervalues():
            for group_c in key_b.itervalues():
                for value in group_c.itervalues():
                    values.append(value)
    return max(values)

filtered = sorted(data["GROUP-A"].items(), key=lambda kv: get_biggest_c_value(kv[1]))
print filtered
于 2013-10-31T15:29:12.827 回答