You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在三维列表中统计关联多名称的重复(valA,valB)组合?

解决方案

核心思路

不用itertools.groupby(它更适合按连续元素分组,且需提前排序,而我们需要统计唯一name的数量,用字典映射更高效):

  • 构建字典,键为(valA, valB)组合,值为该组合关联的所有唯一name集合(自动去重)。
  • 过滤出字典中值(name集合)大小≥2的键,即关联多个name的组合(满足需求1)。
  • 从上述结果里筛选出name集合大小≥3的组合,取前x个即可(满足需求2)。

代码实现

处理示例数据

from collections import defaultdict

# 补全示例数据的字符串引号
data = [
    ["john", (10.5, 8.2)],
    ["nick", (7.2, 8.2)],
    ["rog", (7.2, 8.2)],
    ["rog", (8.5, 9.9)],
    ["john", (12.0, 9.2)],
    ["john", (7.2, 8.2)],
    ["nick", (12.0, 9.2)]
]

# 1. 统计每个(valA, valB)对应的唯一name集合
ab_to_names = defaultdict(set)
for name, ab in data:
    ab_to_names[ab].add(name)

# 需求1:找出关联多个name的组合
multi_name_abs = [ab for ab, names in ab_to_names.items() if len(names) >= 2]
print("关联多个name的组合:", multi_name_abs)
# 输出:[(7.2, 8.2), (12.0, 9.2)]

# 需求2:筛选出至少x个关联≥3个name的组合(示例中仅1个符合)
x = 1
target_abs = [ab for ab, names in ab_to_names.items() if len(names) >= 3][:x]
print(f"前{x}个关联至少3个name的组合:", target_abs)
# 输出:[(7.2, 8.2)]

适配大数据集

对于数千条数据,defaultdict的效率完全足够。若要取50个符合条件的组合,只需修改x的值:

x = 50
target_abs = [ab for ab, names in ab_to_names.items() if len(names) >= 3][:x]

为什么不用groupby?

你之前的groupby代码统计的是同一组合出现的次数,但我们需要的是关联的不同name数量——同一个name可能多次关联同一组合,但只算1次。用字典+集合可以直接去重统计唯一name,逻辑更清晰,也无需提前排序数据,效率更高。

内容的提问来源于stack exchange,提问作者gianluca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:12:40