如何用Python实现‘seen’哈希表?解决普通字典KeyError问题
Python风格的"seen"哈希表实现方式
先说说你碰到的问题:Perl里对哈希表的键直接做++操作时,不存在的键会自动初始化为0再加1,但Python的字典没这个特性——当你访问一个不存在的键seen[x]时直接用+=1,就会触发KeyError,因为Python不知道这个键的初始值该设成啥。
下面是几种符合Python风格的实现方式,既能跟踪元素出现次数,又不会报错:
方法1:用字典的get()方法(无需导入模块)
dict.get(key, default)方法会返回键对应的值,如果键不存在就返回你指定的默认值,刚好解决初始值的问题:
seen = {} for x in ['one', 'two', 'three', 'one']: seen[x] = seen.get(x, 0) + 1
执行后seen的结果是{'one': 2, 'two': 1, 'three': 1},完美实现计数去重。
方法2:用collections.defaultdict(更简洁的Pythonic写法)
如果不想每次都写get(),可以用标准库的defaultdict,指定默认值类型为int,这样不存在的键会自动初始化为0:
from collections import defaultdict seen = defaultdict(int) for x in ['one', 'two', 'three', 'one']: seen[x] += 1
这种写法和Perl的风格最接近,代码更简洁,适合频繁做这类计数的场景。
方法3:如果只是单纯去重(不需要计数)
如果你的需求只是去掉重复元素,不需要统计次数,直接用Python的set就搞定了——集合天然不允许重复元素:
unique_elements = list(set(['one', 'two', 'three', 'one']))
不过要注意,Python 3.7之前的集合是无序的,如果你需要保持元素的原始顺序,用方法1里的字典就行(Python 3.7+的字典会保留插入顺序),然后取字典的键即可:
seen = {} for x in ['one', 'two', 'three', 'one']: seen[x] = None # 不需要计数的话,赋值任意值都可以 unique_ordered = list(seen.keys())
内容的提问来源于stack exchange,提问作者Red Cricket
相关产品推荐
相关产品推荐

