从python目录中找出最大值

从python目录中找出最大值,python,dictionary,Python,Dictionary,我是python新手,我有一个dict。我想从dict中找出最大值字段,比如索引0和1的dict中有一个公共值,即1。因此,我想确定最大值,它是0.8,需要指出 0: ['1', 'Metrolink', 0.7054569125175476], 1: ['1', 'Toronto', 0.8], 像wise一样,我希望对所有其他值也这样做 这是我完整的口述 d={ 0: ['1', 'Metrolink', 0.7054569125175476], 1: ['1', 'Toront

我是python新手,我有一个dict。我想从dict中找出最大值字段,比如索引0和1的dict中有一个公共值,即1。因此,我想确定最大值,它是0.8,需要指出

 0: ['1', 'Metrolink', 0.7054569125175476],
 1: ['1', 'Toronto', 0.8],
像wise一样,我希望对所有其他值也这样做

这是我完整的口述

 d={
 0: ['1', 'Metrolink', 0.7054569125175476],
 1: ['1', 'Toronto', 0.8],
 4: ['2', 'Residence Inn Bentonville', 0.721284806728363],
 5: ['2', 'Bentonville, Arkansas', 0.8],
 7: ['2', 'Rogers', 0.5609406232833862],
 8: ['2', 'Toronto', 0.8],
 10: ['2', 'Arkansas', 0.8871413469314575],
 12: ['2', 'CA', 0.5339972972869873],
 14: ['3', 'Toronto', 0.8],
 19: ['3', 'ik', 0.555569052696228],
 21: ['4', 'DL', 0.47785162925720215],
 22: ['4', 'MS', 0.5182732939720154],
 23: ['4', 'Nashville International Airport', 0.8],
 27: ['4', 'Turkey', 0.8],
 30: ['5', 'Hebron, Kentucky', 0.8],
 32: ['5', 'OAK PARK', 0.6157999038696289],
 35: ['5', 'USA', 0.5055036544799805],
 36: ['5', 'Tennessee', 0.5752009153366089],
 37: ['5', 'Recov', 0.6585434675216675],
 38: ['5', 'County (United States)', 0.8],
 40: ['6', 'SFO', 0.6019220948219299],
 42: ['6', 'Ontario', 0.8],
 45: ['7', 'United States', 0.6973987221717834],
 47: ['7', 'Buckingham Gate', 0.8],
 48: ['7', 'London', 0.9545853137969971],
 53: ['8', 'Phoenix, Arizona', 0.8],
 55: ['8', 'STE', 0.5046005249023438],
 56: ['8', 'TULSA', 0.7144339680671692],
 58: ['8', 'UNITED STATES OF AMERICA', 0.8454625606536865],
 60: ['9', 'RDU', 0.6373313069343567],
 61: ['9', 'Raleigh–Durham International Airport', 0.8],
 65: ['9', 'Piauí', 0.8],
 69: ['9', 'CAR', 0.6243148446083069],
 71: ['10', 'MONMOUTH JUNCTION', 0.7259661555290222],
 72: ['10', 'New Jersey', 0.8],
 76: ['10', 'PVK', 0.6593300104141235],
 79: ['10', 'TWW', 0.6495188474655151],
 81: ['10', 'Morrisville, Bucks County, Pennsylvania', 0.8],
 84: ['10', 'United States', 0.8],
 88: ['10', 'New Brunswick, New Jersey', 0.8]

听起来您希望在每个子键(每个条目值的第一项)上获得最大值。为此,您可以使用以下方法:

from collections import defaultdict

max_values = defaultdict(lambda: (float('-inf'), None))

for label, text, value in d.values():
    max_values[label] = max(max_values[label], (value, text))
在这里使用默认值为
(float('-inf'),None)的
defaultdict
允许我们将新的最大值与旧的新值进行比较,而无需首先检查是否记录了最大值

最大值
最终为:

{
    '1': (0.8, 'Toronto'), 
    '2': (0.8871413469314575, 'Arkansas'), 
    '3': (0.8, 'Toronto'), 
    '4': (0.8, 'Turkey'), 
    '5': (0.8, 'Hebron, Kentucky'),
    '6': (0.8, 'Ontario'), 
    '7': (0.9545853137969971, 'London'), 
    '8': (0.8454625606536865, 'UNITED STATES OF AMERICA'),
    '9': (0.8, 'Raleigh–Durham International Airport'), 
    '10': (0.8, 'United States')
}

您可以使用以下代码获得已排序字典:

dict(sorted(d.items(), key=lambda kv:(int(kv[1][0]), kv[1][2])))
如果要根据第一个元素和第二个元素进行排序,请执行以下操作:

dict(sorted(d.items(), key=lambda kv:(int(kv[1][0]), kv[1][1])))
是处理类似表格数据的非常有效的工具。您可以从以下数据创建数据帧:

import pandas as pd
df = pd.DataFrame(d).T
df.columns = ('group', 'place', 'value')
然后打印出最大值

df[df['value']==df.groupby('group')['value'].transform('max')]

Out[41]:
组位置值
1多伦多0.8
102阿肯色州0.887141
143多伦多0.8
23 4纳什维尔国际机场0.8
27 4土耳其0.8
肯塔基州希布伦30 5 0.8
385县(美国)0.8
42 6安大略省0.8
48 7伦敦0.954585
58 8美利坚合众国0.845463
61 9罗利达勒姆国际机场0.8
65 9票0.8
72 10新泽西州0.8
宾夕法尼亚州巴克县莫里斯维尔81 10号0.8
84 10美国0.8
88 10新泽西州新不伦瑞克0.8
如果要以原始格式获取输出,可以使用

[47]中的
df[df['value']==df.groupby('group')['value'].transform('max')].T.to_dict(orient='list'))
出[47]:
{1:[1',多伦多,0.8],
10:[2',阿肯色州,0.8871413469314575],
14:[3','多伦多',0.8],
23:[4',纳什维尔国际机场,0.8],
27:[4','Turkey',0.8],
30:[5',肯塔基州希布伦,0.8],
38:['5','县(美国)',0.8],
42:[6',安大略省,0.8],
48:[7',伦敦,0.9545853137969971],
58:[8',“美利坚合众国”,0.845462560536865],
61:[9',罗利达勒姆国际机场,0.8],
65:[9','Piauí',0.8],
72:[10',新泽西州,0.8],
81:[10','Morrisville,Bucks County,Pennsylvania',0.8],
84:[10',美国,0.8],
88:[10',新泽西州新不伦瑞克,0.8]}
简短解释
  • 可以使用字典作为参数来创建数据帧。这些值应该是列表。
    .T
    只对表进行转置
  • df.groupby('group')['value']
    返回一个SeriesGroupBy对象,其行为非常类似于常规pandas.Series对象。使用该方法,我们可以计算每个
    的最大
  • df['value']==df.groupby('group')['value'].transform('max')
    创建一个布尔掩码,用于通过
    df[mask]
    选择最大行数

这是否回答了您的问题?这很有效。但是我想得到像Metrolink、Toronto等在max_值中有max值的文本。@Binny更新了答案以包括文本,让我知道它是否适用于您。某些组(4、5、8、10)有多个具有相同高值的条目;此方法不会列出组中具有最大值的所有条目。我可以仅从@Mario IshacGood solution的结果中获得多伦多、伦敦等文本吗?还可以使用
transform(max)
而不是
transform('max')
哦,是的,没有考虑
max()
内置。