Python如何计算子列表顺序不敏感的嵌套列表众数
嵌套列表无序匹配求众数实现方案
需求规则
从元素为列表的嵌套列表结构中求解众数,需满足以下规则:
- 子列表内部元素顺序不影响相等判定,例如
["red", "blue"] == ["blue", "red"],二者视为完全相等 - 若存在多个频次相同的最高频元素(即多个众数),需返回全部众数:将所有众数子列表拼接为单个列表后去重,效果等价于对所有众数子列表取并集
- 示例场景中,频次最高的子列表会被纳入结果集,最终返回去重后的并集
测试数据
my_list = [ ["red", "blue", "blue"], ["red"], ["blue","yellow"], ["green","yellow"], ["pink"], ["red", "blue", "blue"], ["red", "green", "red"], ["red", "yellow", "red"], ["green", "red", "blue"], # +1 ["blue", "green", "red"], # +1 ["red", "green", "blue"], # +1 ["red", "green", "blue"], # +1 ["pink", "brown", "black"], # +2 ["pink", "brown", "black"], # +2 ["pink", "brown", "black"], # +2 ["pink", "brown", "black"], # +2 ]
现有方案问题
- 思路方向:将所有子列表按固定规则排序后统计频次,再提取最高频元素,该思路逻辑可行,但需要注意保留子列表内的重复元素信息
- 直接调用标准库
statistics.mode无法适配嵌套列表场景,不支持子列表无序判定,也无法处理多众数取并集的需求
可直接运行的实现代码
核心逻辑是将每个子列表排序后转为可哈希的元组作为统计键,既解决无序判定问题,也能保留子列表内的重复元素,避免误判包含重复值的子列表。
from collections import Counter def get_nested_list_mode(nested_list): count_map = Counter() # 建立排序元组到原子列表的映射 origin_sub_map = {} for sub_list in nested_list: # 按统一规则排序后转元组,作为统计的唯一键 sorted_key = tuple(sorted(sub_list)) count_map[sorted_key] += 1 if sorted_key not in origin_sub_map: origin_sub_map[sorted_key] = sub_list # 取最高频次 max_freq = max(count_map.values()) # 收集所有达到最高频次的子列表 mode_groups = [origin_sub_map[key] for key, freq in count_map.items() if freq == max_freq] # 多众数拼接后去重,等价于取并集 return list({element for group in mode_groups for element in group}) # 测试调用 if __name__ == "__main__": result = get_nested_list_mode(my_list) print(result)
注意:不要使用
frozenset作为统计键,frozenset会自动丢弃子列表内的重复元素,会把["red", "blue", "blue"]和["red", "blue"]判定为相等,不符合需求。
针对给出的测试数据,["red", "green", "blue"]和["pink", "brown", "black"]均出现4次,为并列最高频,最终返回的并集结果为['red', 'blue', 'green', 'pink', 'brown', 'black'],符合规则要求。如果单组子列表频次最高,则返回该子列表去重后的元素集合。
内容的提问来源于stack exchange,提问作者Aayush Shah
相关产品推荐
相关产品推荐

