我很难弄清楚如何设置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中的值排序的key-C类型的dict列表,但不改变该键内的数据结构。
例如,根据上面提供的数据,我希望看到:
[{"key-A3":{..}},{"key-A1":{..}},{"key-A2":{..}}]这是单sort()函数可以实现的,还是太复杂了?
可能是这种类型的东西:
filtered = sorted(data["GROUP-A"].items(), key= lambda kv: (??????))我已经对lambda函数做了一段时间的修改,但是我无法像预期的那样工作。
如果可以,你能解释一下所涉及的步骤吗?我要死才能明白你是怎么把问题分成小部分的.以及背后的理由。
谢谢!
编辑:如果您想尝试一下http://repl.it/MDY/1,这里有一个指向在线python编辑器的链接
发布于 2013-10-31 15:29:12
您可以将多个列表理解链接在一起,以遍历字典的各个层。
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 filteredhttps://stackoverflow.com/questions/19709893
复制相似问题