python学习笔记(15):defaultdict的用法

好久没更新,被大佬们批评了。好吧,今天好好学习,天天向上一下。

众所周知,本人最近一直在刷题,但目的可能与大家有所不同。我的基础不是不好,所以我是抱着通过练习一些算法题目来查漏补缺、巩固下python基础的。

虽然大部分简单的题目都做不出来,但是我还是愿意来刷一刷,原因呢,或许是为了弥补那些逝去的光阴吧。

打卡题目

这里先放上题目,有兴趣的同学可以试着做一做。

https://leetcode-cn.com/problems/repeated-dna-sequences/

defaultdict的用法 - 图1

先上答案吧:

  1. L=10
  2. class Solution:
  3. def findRepeatedDnaSequences(self, s: str) -> List[str]:
  4. ans=[]
  5. cnt=defaultdict(int)
  6. for i in range(len(s)-L+1):
  7. sub=s[i:i+L]
  8. cnt[sub]+=1
  9. if cnt[sub]==2:
  10. ans.append(sub)
  11. return ans

知识点

今天就介绍一下遇到的一个知识点:defaultdict。当我看到答案的时候就在想,他为啥不用{}呢。我就试了下:

defaultdict的用法 - 图2

直接报错了,keyError。哦,百度一番,明白了:

当我使用普通的字典时,用法一般是dict={},添加元素的只需要dict[element] =value即,调用的时候也是如此,dict[element] = xxx,但前提是element在字典里,如果不在字典里就会报错。

defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值

我们再看下源码,加深记忆:

defaultdict的用法 - 图3

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

defaultdict的用法 - 图4

defaultdict的用法 - 图5

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

defaultdict的用法 - 图6

参考文章:

https://www.jianshu.com/p/bbd258f99fd3

想直接用字典也不是不可以,嘿嘿:

defaultdict的用法 - 图7

没有看明白的变态解法:

  1. L = 10
  2. bin = {'A': 0, 'C': 1, 'G': 2, 'T': 3}
  3. class Solution:
  4. def findRepeatedDnaSequences(self, s: str) -> List[str]:
  5. n = len(s)
  6. if n <= L:
  7. return []
  8. ans = []
  9. x = 0
  10. for ch in s[:L - 1]:
  11. x = (x << 2) | bin[ch]
  12. cnt = defaultdict(int)
  13. for i in range(n - L + 1):
  14. x = ((x << 2) | bin[s[i + L - 1]]) & ((1 << (L * 2)) - 1)
  15. cnt[x] += 1
  16. if cnt[x] == 2:
  17. ans.append(s[i : i + L])
  18. return ans

好的,今天的更新完毕,下次再见。