Python字典列表中Receiver字段后缀匹配筛选及进阶需求
问题与解决方案
初始需求:筛选Receiver后缀重复的字典
问题描述
给定字典列表,需仅保留Receiver字段最后3个字符与其他字典该字段存在重复的项。原代码因嵌套循环重复遍历,导致结果重复且包含后缀唯一的项,不符合预期。
原代码问题分析
原代码通过双重循环逐个匹配后缀,每匹配到一次就将对应字典加入结果列表,导致同一字典被多次添加;同时未过滤掉后缀仅出现一次的项(如bob333、kyle444等)。
正确实现
先统计所有Receiver后缀(最后3字符)的出现频次,再筛选出后缀频次>1的字典:
transactions = [ {"Receiver":"alice111","Amount":50}, {"Receiver":"alice222","Amount":60}, {"Receiver":"alice111","Amount":70}, {"Receiver":"bob111","Amount":50}, {"Receiver":"bob222","Amount":150}, {"Receiver":"bob333","Amount":100}, {"Receiver":"kyle444","Amount":260}, {"Receiver":"richard555","Amount":260} ] # 统计每个后缀的出现次数 suffix_counts = {} for item in transactions: suffix = item["Receiver"][-3:] suffix_counts[suffix] = suffix_counts.get(suffix, 0) + 1 # 筛选后缀出现次数>1的项 result = [item for item in transactions if suffix_counts[item["Receiver"][-3:]] > 1] print(result)
输出结果:
[{"Receiver":"alice111","Amount":50},{"Receiver":"alice222","Amount":60},{"Receiver":"alice111","Amount":70},{"Receiver":"bob111","Amount":50},{"Receiver":"bob222","Amount":150}]
进阶需求:筛选后缀相同且前缀不同的字典
问题描述
需保留Receiver字段最后3个字符相同,且前缀(最后3字符之前的部分)不同的字典。即某个后缀对应的前缀集合至少包含2个不同值时,所有属于该后缀的字典都需要保留。
正确实现
先统计每个后缀对应的前缀集合,再筛选出后缀对应的前缀数量>=2的字典:
transactions1 = [ {"Receiver":"alice111","Amount":50}, {"Receiver":"alice111","Amount":70}, {"Receiver":"bob222","Amount":50}, {"Receiver":"bob222","Amount":150}, {"Receiver":"bob222","Amount":100}, {"Receiver":"richard111","Amount":260}, {"Receiver":"bob333","Amount":100}, {"Receiver":"alice333","Amount":300}, ] # 统计每个后缀对应的前缀集合 suffix_prefix_map = {} for item in transactions1: receiver = item["Receiver"] suffix = receiver[-3:] prefix = receiver[:-3] if suffix not in suffix_prefix_map: suffix_prefix_map[suffix] = set() suffix_prefix_map[suffix].add(prefix) # 筛选后缀对应的前缀数量>=2的项 result = [item for item in transactions1 if len(suffix_prefix_map[item["Receiver"][-3:]]) >= 2] print(result)
输出结果:
[{"Receiver":"alice111","Amount":50}, {"Receiver":"alice111","Amount":70},{"Receiver":"richard111","Amount":260},{"Receiver":"bob333","Amount":100},{"Receiver":"alice333","Amount":300}]
内容的提问来源于stack exchange,提问作者piethon
相关产品推荐
相关产品推荐

