根据具有多个词典的数组(或列表)中的优先级保留值(或项目),并删除重复项


Array_1 = [{'name': 'Anna','rank': 'first', 'roll_no': 'R1111','id': '1000'},{'name': 'Anna','rank': 'first', 'roll_no': 'R1111','id': '1000'},{'name': 'Anna','rank': 'second', 'roll_no': 'R1111','id': '1000'},{'name': 'Bob','rank': 'first', 'roll_no': 'R1112','id': '1001'},{'name': 'Charles','rank': 'third', 'roll_no': 'R1113','id': '1002'},{'name': 'Charles','rank': 'second', 'roll_no': 'R1113','id': '1002'},{'name': 'Darwin','rank': 'fourth', 'roll_no': 'R1114','id': '1003'},{'name': 'Darwin','rank': 'second', 'roll_no': 'R1114','id': '1003'},{'name': 'Darwin','rank': 'second', 'roll_no': 'R1114','id': '1003'},{'name': 'Eve','rank': 'fifth', 'roll_no': 'R1115','id': '1004'}]

我有一个带有多个复制品的词典的数组。我想删除重复项>仅根据 PRIRESITY 保留值

我的优先级是 rank :' first 'then' second '然后'第三',然后在

{'id': '1000', 'rank': 'first', 'roll_no': 'R1111', 'name': 'Anna'}
{'id': '1000', 'rank': 'first', 'roll_no': 'R1111', 'name': 'Anna'}
{'id': '1000', 'rank': 'second', 'roll_no': 'R1111', 'name': 'Anna'}
{'id': '1001', 'rank': 'first', 'roll_no': 'R1112', 'name': 'Bob'}
{'id': '1002', 'rank': 'third', 'roll_no': 'R1113', 'name': 'Charles'}
{'id': '1002', 'rank': 'second', 'roll_no': 'R1113', 'name': 'Charles'}
{'id': '1003', 'rank': 'fourth', 'roll_no': 'R1114', 'name': 'Darwin'}
{'id': '1003', 'rank': 'second', 'roll_no': 'R1114', 'name': 'Darwin'}
{'id': '1003', 'rank': 'second', 'roll_no': 'R1114', 'name': 'Darwin'}
{'id': '1004', 'rank': 'fifth', 'roll_no': 'R1115', 'name': 'Eve'}

我想要这个

{'id': '1000', 'rank': 'first', 'roll_no': 'R1111', 'name': 'Anna'}
{'id': '1001', 'rank': 'first', 'roll_no': 'R1112', 'name': 'Bob'}
{'id': '1002', 'rank': 'second', 'roll_no': 'R1113', 'name': 'Charles'}
{'id': '1003', 'rank': 'second', 'roll_no': 'R1114', 'name': 'Darwin'}
{'id': '1004', 'rank': 'fifth', 'roll_no': 'R1115', 'name': 'Eve'}
Uniq = []
for i in range(len(Array_1)-1):
    if Array_1[i]["name"] != Array_1[i+1]["name"]:
        Uniq.append(Array_1[i])
Uniq.append(Array_1[-1])

它只需要在列表和顺序中迭代:

import pprint
l = [{'id': '1000', 'rank': 'first', 'roll_no': 'R1111', 'name': 'Anna'},
{'id': '1000', 'rank': 'first', 'roll_no': 'R1111', 'name': 'Anna'},
{'id': '1000', 'rank': 'second', 'roll_no': 'R1111', 'name': 'Anna'},
{'id': '1001', 'rank': 'first', 'roll_no': 'R1112', 'name': 'Bob'},
{'id': '1002', 'rank': 'third', 'roll_no': 'R1113', 'name': 'Charles'},
{'id': '1002', 'rank': 'second', 'roll_no': 'R1113', 'name': 'Charles'},
{'id': '1003', 'rank': 'fourth', 'roll_no': 'R1114', 'name': 'Darwin'},
{'id': '1003', 'rank': 'second', 'roll_no': 'R1114', 'name': 'Darwin'},
{'id': '1003', 'rank': 'second', 'roll_no': 'R1114', 'name': 'Darwin'},
{'id': '1004', 'rank': 'fifth', 'roll_no': 'R1115', 'name': 'Eve'}]
order = ['first', 'second', 'third', 'fourth', 'fifth']
l2 = []
list_of_names = []
for elem in l:
    if elem['name'] not in list_of_names:
        list_of_names.append(elem['name'])
for name in list_of_names:
    for order_elem in order:
        for elem in l:
            if elem['rank'] == order_elem and elem['name'] == name:
                l2.append(elem)
                break
        else:
            continue
        break
pprint.pprint(l2, indent=4)

您可以尝试使用itertools.groupby()将名称首先组合在一起,然后根据等级对这些名称进行排序,然后从每个排序列表中选择最高等级:

from itertools import groupby
data = [{'id': '1000', 'rank': 'first', 'roll_no': 'R1111', 'name': 'Anna'},
        {'id': '1000', 'rank': 'first', 'roll_no': 'R1111', 'name': 'Anna'},
        {'id': '1000', 'rank': 'second', 'roll_no': 'R1111', 'name': 'Anna'},
        {'id': '1001', 'rank': 'first', 'roll_no': 'R1112', 'name': 'Bob'},
        {'id': '1002', 'rank': 'third', 'roll_no': 'R1113', 'name': 'Charles'},
        {'id': '1002', 'rank': 'second', 'roll_no': 'R1113', 'name': 'Charles'},
        {'id': '1003', 'rank': 'fourth', 'roll_no': 'R1114', 'name': 'Darwin'},
        {'id': '1003', 'rank': 'second', 'roll_no': 'R1114', 'name': 'Darwin'},
        {'id': '1003', 'rank': 'second', 'roll_no': 'R1114', 'name': 'Darwin'},
        {'id': '1004', 'rank': 'fifth', 'roll_no': 'R1115', 'name': 'Eve'}]
orders = ['first', 'second', 'third', 'fourth', 'fifth'] 
rank_priority = []
# group based on names
for _, group in groupby(data, lambda x: x['name']):
    # create an ordered dictionary based on ranks
    order_dict = {rank: index for index, rank in enumerate(orders)}
    # sort lists based on dictionary ordering above
    sorted_ranks = sorted(list(group), key = lambda x: order_dict[x['rank']])
   # extract highest rank
    rank_priority.append(sorted_ranks[0])
print(rank_priority)

输出:

[{'name': 'Anna', 'id': '1000', 'rank': 'first', 'roll_no': 'R1111'}, 
 {'name': 'Bob', 'id': '1001', 'rank': 'first', 'roll_no': 'R1112'}, 
 {'name': 'Charles', 'id': '1002', 'rank': 'second', 'roll_no': 'R1113'}, 
 {'name': 'Darwin', 'id': '1003', 'rank': 'second', 'roll_no': 'R1114'}, 
 {'name': 'Eve', 'id': '1004', 'rank': 'fifth', 'roll_no': 'R1115'}]

最新更新