python学习笔记(15):defaultdict的用法
好久没更新,被大佬们批评了。好吧,今天好好学习,天天向上一下。
众所周知,本人最近一直在刷题,但目的可能与大家有所不同。我的基础不是不好,所以我是抱着通过练习一些算法题目来查漏补缺、巩固下python基础的。
虽然大部分简单的题目都做不出来,但是我还是愿意来刷一刷,原因呢,或许是为了弥补那些逝去的光阴吧。
打卡题目
这里先放上题目,有兴趣的同学可以试着做一做。

先上答案吧:
L=10class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:ans=[]cnt=defaultdict(int)for i in range(len(s)-L+1):sub=s[i:i+L]cnt[sub]+=1if cnt[sub]==2:ans.append(sub)return ans
知识点
今天就介绍一下遇到的一个知识点:defaultdict。当我看到答案的时候就在想,他为啥不用{}呢。我就试了下:

直接报错了,keyError。哦,百度一番,明白了:
当我使用普通的字典时,用法一般是dict={},添加元素的只需要dict[element] =value即,调用的时候也是如此,dict[element] = xxx,但前提是element在字典里,如果不在字典里就会报错。
defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值
我们再看下源码,加深记忆:

defaultdict()返回类似字典类型的对象,其特点是会自动为将要访问的键(就算目前字典中并不存在这样的键)创建映射实体。也就是说,当通过key来访问对应的value时,普通字典中若还没有事先创建该键值对,则会发生访问错误。而defaultdict()可以在访问没有事先建立好的键值对时,自动构建相应键值对以供访问,构建方法由参数default_factory决定。


既然源码说到了called,那么在python中的数据类型都有哪些呢?

参考文章:
想直接用字典也不是不可以,嘿嘿:

没有看明白的变态解法:
L = 10bin = {'A': 0, 'C': 1, 'G': 2, 'T': 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n = len(s)if n <= L:return []ans = []x = 0for ch in s[:L - 1]:x = (x << 2) | bin[ch]cnt = defaultdict(int)for i in range(n - L + 1):x = ((x << 2) | bin[s[i + L - 1]]) & ((1 << (L * 2)) - 1)cnt[x] += 1if cnt[x] == 2:ans.append(s[i : i + L])return ans
好的,今天的更新完毕,下次再见。
