python - python 字典中部分匹配键的最大值

标签 python python-2.7

我有以下字典,其中键是“月,国家/地区:ID”,值只是总计:

ID_dict = {'11,United Kingdom:14416': 129.22, '11,United Kingdom:17001': 357.6, 
'12,United States:14035': 90000.0, '12,United Kingdom:17850': 241.16,'12,United 
States:14099': 90000.0, '12,France:12583': 252.0, '12,United Kingdom:13047': 
215.13, '01,Germany:12662': 78.0, '01,Germany:12600': 14000}

实际的字典会比这个大得多。

我正在尝试返回包含最高总数的每个“月份、国家/地区”的 key 。如果存在平局,则 ID 将以逗号分隔。基于上面字典的示例输出:

'11,United Kingdom:17001'
'12,United Kingdom:17850'
'12,United States:14035, 14099'
'12,France:12583'
'01,Germany:12600'

我可以使用以下代码获取最高值的字符串:

highest = max(ID_dict.values())
print([k for k, v in ID_dict.items() if v == highest])

但确实很难克服这一点。我正在尝试使用 re.match 和 re.search,但并没有取得多大进展。

最佳答案

您可以找到每个月份、国家/地区对的最大值,并将此关系存储在字典中。然后创建一个字典,其中键为 (月,国家/地区) 对,值为 ID 列表,其值等于该 (月) 的最大值,国家) 对:

import re

ID_dict = {'11,United Kingdom:14416': 129.22, '11,United Kingdom:17001': 357.6,
           '12,United States:14035': 90000.0, '12,United Kingdom:17850': 241.16, '12,United States:14099': 90000.0,
           '12,France:12583': 252.0, '12,United Kingdom:13047': 215.13, '01,Germany:12662': 78.0,
           '01,Germany:12600': 14000}

table = {tuple(re.split(',|:', key)[:2]): value for key, value in sorted(ID_dict.items(), key=lambda e: e[1])}

result = {}
for key, value in ID_dict.items():
    splits = re.split(',|:', key)
    if value == table[tuple(splits[:2])]:
        result.setdefault(tuple(splits[:2]), []).append(splits[2])

for key, value in result.items():
    print('{}:{}'.format(','.join(key), ', '.join(value)))

输出

01,Germany:12600
12,United States:14099, 14035
12,United Kingdom:17850
11,United Kingdom:17001
12,France:12583

上面的方法是O(nlogn),因为它使用排序,要使其O(n),您可以更改字典理解通过这个循环:

table = {}
for s, v in ID_dict.items():
    key = tuple(re.split(',|:', s)[:2])
    table[key] = max(table.get(key, v), v)

关于python - python 字典中部分匹配键的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460092/

相关文章:

python - 将空字符串转换为零

Python - 排除两个日期之间的周末

python - 输出给定列表中的所有偶数,每行一个

python - 无法读取非 ASCII 内容

python - 平滑框过滤器的内核大小

python - 如何修复Python中的 'TypeError: __init__() missing 1 required positional argument: '部分''错误

python - 在 Python 中使用 Xlsxwriter 合并 Excel 单元格

Python 2.7 MySQLdb将从数据库读取的最后一行保存到文本文件中

python - 如何在 Spyder 中启用#TODO/XXX/FIXME 高亮显示?

python - Python 中的 3 维矩阵