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'}]