在python DICT列表中仅选择最大值
我有一份目录如下:在python DICT列表中仅选择最大值,python,list,dictionary,Python,List,Dictionary,我有一份目录如下: [{"server":"8.8.8.8", "domains":[{"google.com":[{"time":15, "serial":14}, {"time":78, "serial":14}]}, {"intuit.com":[{"time":20, "serial":23}, {"time":91, "serial":18}]} ] }, {"server":"8.8.4.4", "domains":[{"g
[{"server":"8.8.8.8",
"domains":[{"google.com":[{"time":15, "serial":14}, {"time":78, "serial":14}]},
{"intuit.com":[{"time":20, "serial":23}, {"time":91, "serial":18}]}
]
},
{"server":"8.8.4.4",
"domains":[{"google.com":[{"time":19, "serial":45}, {"time":92, "serial":76}]},
{"intuit.com":[{"time":45, "serial":89}, {"time":93, "serial":74}]}
]
},
{"server":"206.67.222.222",
"domains":[{"google.com":[{"time":98, "serial":76}, {"time":64, "serial":54}]},
{"intuit.com":[{"time":43, "serial":21}, {"time":65, "serial":59}]}
]
}]
我将如何创建一个结构,其中我仅为每个域选择具有最大序列号的dict,当我具有相同的序列号时,选择最大时间,以便留下以下内容:
[{"server":"8.8.8.8",
"domains":[{"google.com":{"time":78, "serial":14}},
{"intuit.com":{"time":20, "serial":23}}
]
},
{"server":"8.8.4.4",
"domains":[{"google.com":{"time":92, "serial":76}},
{"intuit.com":{"time":45, "serial":89}}
]
},
{"server":"206.67.222.222",
"domains":[{"google.com":{"time":98, "serial":76}},
{"intuit.com":{"time":65, "serial":59}}
]
}]
试试这个d是你的口头禅:
for item in d:
for i in item["domains"]:
for k, v in i.items():
c = sorted([(j["time"], j["serial"]) for j in v], key=lambda x: (x[1], x[0]))
i[k] = {"time": c[-1][0], "serial": c[-1][1]}
print d
使用内置max功能的解决方案:
import json
# l is your initial list of dicts
for item in l:
for d in item['domains']:
for k, v in d.items():
# whether `serial` numbers are unique
has_uniq_serial = len(set([i['serial'] for i in v])) > 1
d[k] = max(v, key=lambda o: o['serial']) if has_uniq_serial else max(v, key=lambda o: o['time'])
# `json.dumps` used for pretty printing of nested dicts
print(json.dumps(l, indent=4))
输出:
[
{
"server": "8.8.8.8",
"domains": [
{
"google.com": {
"serial": 14,
"time": 78
}
},
{
"intuit.com": {
"serial": 23,
"time": 20
}
}
]
},
{
"server": "8.8.4.4",
"domains": [
{
"google.com": {
"serial": 76,
"time": 92
}
},
{
"intuit.com": {
"serial": 89,
"time": 45
}
}
]
},
{
"server": "206.67.222.222",
"domains": [
{
"google.com": {
"serial": 76,
"time": 98
}
},
{
"intuit.com": {
"serial": 59,
"time": 65
}
}
]
}
]
您可以根据需要对每个域的时间序列列表进行排序,并获得第一个,让变量数据作为您的输入列表:
def domain_sorter(d):
def compare(x, y):
k = y['serial'] - x['serial']
j = y['time'] - x['time']
return k if k != 0 else j
return sorted(d, cmp=compare)
def filter_domain(domain):
for k, v in domain.items():
return {
k: domain_sorter(v)[0]
}
print [{
"server": e['server'],
"domains": [filter_domain(domain) for domain in e['domains']]
} for e in data]
为什么要投否决票???@McGrady..我想你误解了我的要求..它应该选择具有最大序列号的dict..只有当两个dict具有相同序列号时,它才应该选择具有最大时间的dict..而不是同时具有最大时间和最大时间的dictserial@Amistad我更新我的答案,试一试,我认为这是一种更简单的方法。只需将dict转换为tuple并对其排序。您就会得到结果。