加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在字典列表中按类别获取最大值

发布时间:2020-12-20 13:07:56 所属栏目:Python 来源:网络整理
导读:我有一个字典列表,看起来像这样: example = [ {'id': 1,'foo': 10,'seq': 1,'val': 0,'sum': 0},{'id': 1,'foo': 94,'seq': 2,'val': 5,'sum': 5},'foo': 32,'seq': 3,'val': 32,'sum': 37},{'id': 2,'foo': 43,'val': 3,'sum': 3},'foo': 71,'val': 14,'su
我有一个字典列表,看起来像这样:

example = [
    {'id': 1,'foo': 10,'seq': 1,'val':  0,'sum':  0},{'id': 1,'foo': 94,'seq': 2,'val':  5,'sum':  5},'foo': 32,'seq': 3,'val': 32,'sum': 37},{'id': 2,'foo': 43,'val':  3,'sum':  3},'foo': 71,'val': 14,'sum': 17},'seq': 4,'val':  6,'sum': 23},{'id': 3,'foo': 26,'foo': 38,'val':  8,'sum':  8}
]

我需要列表中的三个关键信息:

1)我需要为列表中的每个’id’标识最高’seq’值.

2)使用(1)的结果,我需要将每个最高’seq’值的’sum’值与其他最高’seq’值进行比较,并确定哪个’seq’值具有最低’sum’.

3)这个过程很复杂,因为我还需要根据’foo’值进行比较,这样(2)中的比较只比较’sum’值,其中第一个和最后一个’foo’值是相同.

因此,在示例列表中,我希望将’id’值1和2相互比较,因为它们以’foo’10开头并以’foo’32结尾.

这是我希望得到的一些伪代码:

def getMinId(foo1,foo2,exampleList):
    # first limit exampleList to only ids that match the foos
    # next find the minimum 'sum' among the remaining ids

所需的最终输出可能如下所示:

{(10,32): 23,(26,38): 8}

我可以通过对列表进行大量迭代来强制执行此操作,但我想知道是否有更有效的方法来执行此操作.唯一真正重要的结果是找到每个’foo’对的最小’sum’值,所以如果有更好的方法来考虑它,请随意忽略我在这里列出的步骤.

解决方法

这适用于您的示例(在Python 2.7中).一定要在更大的数据集上进行测试.

maxvaldict.py

example = [
    {'id': 1,'sum':  8}
]

# Dictionary identifying highest 'seq' value for each 'id' in the list.
# {id: [seq,sum,first_foo,last_foo]}
maxiddict = {}
for rowdict in example:
    if not maxiddict.get(rowdict['id']) or rowdict['seq'] > maxiddict.get(rowdict['id'])[0]:
        if not maxiddict.get(rowdict['id']):
            maxiddict[rowdict['id']] = [rowdict['seq'],rowdict['sum'],rowdict['foo'],rowdict['foo']]
        else:
            first_foo = maxiddict[rowdict['id']][2]
            maxiddict[rowdict['id']] = [rowdict['seq'],rowdict['foo']]

# Dictionary of groups of maxiddicts grouped by a combined key of first_foo,last_foo
# {'first_foo,last_foo': [{id: [seq,last_foo]}]}
groupdict = {}
for k,v in maxiddict.items():
    key = ','.join([str(v[2]),str(v[3])])
    if not groupdict.get(key):
        groupdict[key] = [dict([(k,v)])]
    else:
        groupdict[key].append(dict([(k,v)]))

# Dictionary of lowest sums of maxidicts entries grouped by combined key of first_foo,last_foo
lowestsumsdict = {}
for groupkey,groupvallist in groupdict.items():
    minsum = min([entry.itervalues().next()[1] for entry in groupvallist])
    lowestsumsdict[groupkey] = minsum

print lowestsumsdict

输出:

(maxvaldict)macbook:maxvaldict joeyoung$python maxvaldict.py 
{'26,38': 8,'10,32': 23}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读