Python如何优雅统计元组列表中各key对应的不同value数量
实现方案
推荐两种常用的Pythonic写法,按需选择即可:
写法1:性能最优,可读性最高(推荐绝大多数场景使用)
利用collections.defaultdict搭配集合自动去重,时间复杂度为O(n):
from collections import defaultdict # 示例输入 tuple_list = [("k1", 400), ("k1", 500), ("k2", 600), ("k2", 600), ("k3", 600)] key_values = defaultdict(set) for key, value in tuple_list: key_values[key].add(value) # 转换为统计数量的结果 result = {k: len(v) for k, v in key_values.items()}
运行后result的值为{'k1': 2, 'k2': 1, 'k3': 1},完全符合预期。
如果不想导入外部模块,也可以用原生字典的setdefault方法实现相同逻辑:
tuple_list = [("k1", 400), ("k1", 500), ("k2", 600), ("k2", 600), ("k3", 600)] key_values = {} for key, value in tuple_list: key_values.setdefault(key, set()).add(value) result = {k: len(v) for k, v in key_values.items()}
写法2:一行实现(适合小数据集使用)
如果偏好更短的代码,可以用itertools.groupby实现,注意该方法需要先对输入列表按key排序,时间复杂度为O(n log n),大数据量下性能不如第一种写法:
from itertools import groupby tuple_list = [("k1", 400), ("k1", 500), ("k2", 600), ("k2", 600), ("k3", 600)] result = {k: len(set(v for _, v in group)) for k, group in groupby(sorted(tuple_list), key=lambda x: x[0])}
内容的提问来源于stack exchange,提问作者IsaacLevon
相关产品推荐
相关产品推荐

