如何统计字典元组中所有不重复键的总数量?
解决字典元组中不重复键的统计问题
嘿,这个问题很好解决,核心就是去重嘛!你原来的代码用列表存所有键,重复的c和e会被多次添加,所以得到9而不是预期的7。咱们可以利用Python里的set(集合)来搞定,因为集合天然不允许重复元素,完美契合需求。
下面给你几种简洁高效的实现方式:
方法一:分步遍历+集合收集
这种方式逻辑清晰,适合新手理解:
def count_unique_keys(self): unique_keys = set() # 遍历元组里的每个字典 for d in self.dl: # 把当前字典的所有键添加到集合(自动去重) unique_keys.update(d) # 字典迭代默认取键,所以d等价于d.keys() return len(unique_keys)
运行这段代码,集合里最终会包含{'a','b','c','d','e','f','g'},长度正好是7。
方法二:一行式生成器+集合
如果喜欢简洁的写法,用生成器表达式直接构建集合:
def count_unique_keys(self): return len({k for d in self.dl for k in d})
这里的生成器{k for d in self.dl for k in d}会遍历所有字典的键,自动去重后生成集合,直接取长度即可,非常清爽。
方法三:用itertools.chain合并键
如果处理的字典数量很多,用itertools.chain可以更高效地合并所有键:
from itertools import chain def count_unique_keys(self): # chain.from_iterable会把每个字典的键连起来,形成一个迭代器 return len(set(chain.from_iterable(self.dl)))
这种方式避免了手动嵌套循环,代码可读性也不错。
为什么原来的代码不对?
你原来的代码把所有键都append到列表new里,重复的c出现了2次,e也出现了2次,总共有3+3+3=9个元素,所以len(new)返回9。而集合会自动剔除重复元素,所以能得到正确的不重复键数量。
内容的提问来源于stack exchange,提问作者sparklecoding




