2 回答

TA贡献1765条经验 获得超5个赞
您可以key为max()和指定一个(即 lambda 函数),min()这可以帮助解决此问题。对于你的第一次测试,
lowest_single_dist = min(x, key=lambda i: i["dist"])
返回 中x具有最低值的元素"dist"。如果您想要所有具有该标签值的元素,您可以使用列表理解:
lowest_dists = [i for i in x if i["dist"] == lowest_single_dist["dist"]]
为了获得最大的分组,我将首先"tag"在该子集中创建一组可能的值,然后检查每个有多少个lowest_dists,然后取哪个计数最高:
tags = [i["tag"] for i in lowest_dists] # get a list of just the tags
ct = {t: tags.count(t) for t in set(tags)} # make a dict of tag:count for each unique tag
max_tag = max(ct, key=lambda x: ct[x]) # find the largest count and get the largest tag
r = [i for i in lowest_dists if i["tag"] == max_tag] # use another list comprehension to get all the max tags
如果你想把它全部缩短成两行,你可以不那么pythonic并这样做:
m = min(x, key=lambda i: (i["dist"], -1 * max([j["tag"] for j in x if j["dist"] == i["dist"]].count(i["tag"])))
r = [i for i in x if i["tag"] == m["tag"] and i["dist"] == m["dist"]]
这利用了这样一个事实,即您可以返回一个元组作为排序的键,并且只有在第一个值相等时才会检查元组的第二个值。我将稍微扩展第一行并解释每个部分的作用:
m = min(x, key=lambda i: (
i["dist"], -1 * max(
[j["tag"] for j in x if j["dist"] == i["dist"]].count(i["tag"])
))
最内层的列表推导式为所有元素生成一个标签列表,其
x
值为"dist"
asi
然后,取与相同的标签计数
i
乘以 -1 使其为负数,以便
min()
正确运行创建一个
i["dist"]
和我们刚刚计算的值(i["tag"]
in的频率x
)的元组,并为每个元素返回该值分配给
m
列表中具有最低值"dist"
和最频繁值的元素"tag"
分配给具有相同值
r
的元素的子列表和x
"dist"
"tag"
所以基本上与上面相同的过程,但更短,效率更低,并且更复杂一些。

TA贡献1859条经验 获得超6个赞
按“dist”中的值对字典列表进行排序,并取最低值
x.sort(key= lambda x:x['dist'])
lowest = x[0]['dist']
创建一个字典列表,其中 'dist' 的值等于最低值
x2 = [i for i in x if i['dist']==lowest]
这应该是你的答案。如果列表中有多个项目,请重复上述过程。
if len(x2)>1:
x3 = [i['tag'] for i in x2]
mode = max(set(x3), key=x3.count)
r = [i for i in x if i['tag']==mode]
添加回答
举报