基于两个属性对字典列表进行深度筛选

2024-04-28 16:12:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图找到一个有效的方法来处理这个问题。我有一个超过40万词条的词典列表。我需要首先从该列表中找到所有共享公共密钥的条目,比如“托盘id”,然后从该子列表中验证所有条目是否共享相同的“位置”密钥。我只想从初始列表中获得具有类似“托盘id”的条目,但前提是其中一个条目的“位置”与其他条目的“位置”不同

这将与托盘id 123456一起工作

entry1 = {'location': 'LOC1', 'pallet-id': '123456', ...}  
entry2 = {'location': 'LOC1', 'pallet-id': '123456', ...}  
entry3 = {'location': 'LOC1', 'pallet-id': '123456', ...}  
entry4 = {'location': 'LOC1', 'pallet-id': '123456', ...} 

因为所有人都在同一个地方,我不在乎这个

这将与托盘id 5555一起工作

entry1 = {'location': 'LOC1', 'pallet-id': '5555', ...}  
entry2 = {'location': 'LOC1', 'pallet-id': '5555', ...}  
entry3 = {'location': 'LOC2', 'pallet-id': '5555', ...}  
entry4 = {'location': 'LOC1', 'pallet-id': '5555', ...}  

在本例中,由于其中一个具有不同的位置,我希望存储这4个条目

我遇到的问题是,通过检查每个托盘id,然后在初始列表中查找同一托盘id的其余部分,报告将花费无限的时间,是否有更有效的方法来处理此问题


Tags: 方法目的id列表密钥条目location词条
1条回答
网友
1楼 · 发布于 2024-04-28 16:12:26

嵌套循环在这里是个坏主意,因为它会导致二次时间复杂性。不过,您可以在线性时间内完成:

from collections import Counter
from operator import itemgetter

pal = itemgetter('pallet-id')
pal_loc = itemgetter('pallet-id', 'location')

# unique pallet-id, location combos
pallocs = set(map(pal_loc, entries))
# set([('5555', 'LOC1'), ('5555', 'LOC2'), ('123456', 'LOC1')])

# count pallet-id occurrences in the unique combos
count = Counter(pl[0] for pl in pallocs) 
# Counter({'5555': 2, '123456': 1})

# filter the entries for pallet-ids with counts greater than 1
filtered_entries = [e for e in entries if count[pal(e)] > 1]

相关问题 更多 >