Python如何统计嵌套列表中元素两两关联的共现次数
嵌套列表元素对共现次数统计实现
注意:Python中列表是可变类型,无法作为字典的键,因此实际存储元素对需要使用不可变的元组类型,和你预期的列表键语义完全一致,不影响结果使用。
核心实现逻辑
- 逐一遍历原始嵌套列表中的每个子列表
- 对单个子列表先做去重处理,避免同子列表内的重复元素生成无效配对、重复计数
- 对去重后的子列表元素,生成所有不考虑顺序的两两元素组合(即两个元素只生成一个配对,不区分先后顺序)
- 用计数结构累加每个元素对的出现次数,遍历完全部子列表后即可得到最终结果
代码实现
写法1:使用Python标准库(简洁高效)
用标准库itertools.combinations生成无序配对,collections.Counter做计数,代码最简洁:
from itertools import combinations from collections import Counter x = [['apple', 'banana', 'carrot'], ['apple', 'banana'], ['banana', 'carrot']] pair_counter = Counter() for sub_list in x: unique_items = set(sub_list) # 生成长度为2的所有无序元素组合 for pair in combinations(unique_items, 2): # 排序后转元组,保证同一元素对的键完全一致 fixed_pair = tuple(sorted(pair)) pair_counter[fixed_pair] += 1 print(dict(pair_counter))
运行输出:{('apple', 'banana'): 2, ('apple', 'carrot'): 1, ('banana', 'carrot'): 2}
和你预期的计数结果完全匹配。
写法2:不依赖导入库的原生实现
如果不想引入标准库模块,也可以通过双层循环手动生成配对,逻辑完全一致:
x = [['apple', 'banana', 'carrot'], ['apple', 'banana'], ['banana', 'carrot']] pair_counter = {} for sub_list in x: unique_items = list(set(sub_list)) n = len(unique_items) # 双层循环生成所有i<j的无序配对,避免重复 for i in range(n): for j in range(i + 1, n): pair = (unique_items[i], unique_items[j]) fixed_pair = tuple(sorted(pair)) if fixed_pair not in pair_counter: pair_counter[fixed_pair] = 0 pair_counter[fixed_pair] += 1 print(pair_counter)
关键细节说明
- 对子列表做
set去重:如果子列表内存在重复元素(比如['apple', 'apple', 'banana']),去重后可以避免生成('apple', 'apple')这类无意义的配对,也不会重复统计同一个子列表内的共现关系 - 对配对做排序处理:可以保证不管子列表内元素的书写顺序如何,同一个元素对生成的字典键完全一致,不会出现
('apple', 'banana')和('banana', 'apple')被识别为两个不同键的问题
内容的提问来源于stack exchange,提问作者Sebastien Grima
相关产品推荐
相关产品推荐

