python - 字典 - 更新键的文本值 - 设置优先级(最大原则)

python - dictionary - update text values of keys - setting an priority (max principle)

我有以下字符串作为字典键的值:

["low", "middle", "high", "very high"]

这些是字典项键 'priority' 的选项,一个示例字典元素是:

{'name': 'service', 'priority': value}

我的任务是收集带有键的字典列表,键值都不同'priority'。

my_list = [{'name': 'service', 'priority': 'low'}, {'name': 'service', 'priority': 'high'}]

最后应该存在一个具有最高优先级值的最终字典项。它应该像最大原则一样工作。在这种情况下 {'name': 'service', 'priority': 'high'} 将是结果。

问题是该值是一个字符串,而不是一个整数。 感谢所有让它发挥作用的想法。

这是你想要的吗?

priorities = ["low", "middle", "high", "very high"]
items = [{'name': 'service', 'priority': 'high'}, {'name': 'service2', 'priority': 'high'}, {'name': 'service', 'priority': 'very high'}, {'name': 'service2', 'priority': 'very high'}]

max_priority = max(items, key=lambda item: priorities.index(item['priority']))['priority']
max_items = [item for item in items if item['priority'] == max_priority]
print(max_items)

输出:

[{'name': 'service', 'priority': 'very high'}, {'name': 'service2', 'priority': 'very high'}]

这里是 itertools 模块的使用方法:

# Step 0: prepare data

score = ["low", "middle", "high", "very high"]
my_list = [{'name': 'service', 'priority': 'low', 'label1':'text'}, {'name': 'service', 'priority': 'middle', 'label2':'text'}, {'name': 'service_b', 'priority': 'middle'}, {'name': 'service_b', 'priority': 'very high'}]

my_list      # to just show source data in list

Out[1]:   

    [{'name': 'service', 'priority': 'low', 'label1': 'text'},
     {'name': 'service', 'priority': 'middle', 'label2': 'text'},
     {'name': 'service_b', 'priority': 'middle'},
     {'name': 'service_b', 'priority': 'very high'}]

# Step 0.5: convert bytes-string (if it is) to string  
# my_list = [{k:(lambda x: (x.decode() if type(x) == bytes else x))(v) for k,v in i.items()} for i in my_list ]

# Step 1: reorganize "score"-list on most useful way - to dict

score_dic = {i[0]:i[1] for i in list(zip(score, range(len(score))))}
score_dic

Out[2]:
    {'low': 0, 'middle': 1, 'high': 2, 'very high': 3}


# Step 2: get result 

import itertools

[max(list(g), key = lambda b: score_dic[b['priority']]) for k,g in itertools.groupby(my_list, lambda x:x['name'])]

Out[3]:
    [{'name': 'service', 'priority': 'middle', 'label2': 'text'},
     {'name': 'service_b', 'priority': 'very high'}]