字典
字典类似于列表,但更加通用
键值对 ,字典是 键与值之间的映射,每个键都映射到一个值上
dict
可以创建一个不包含任何项的字典
eng2sp = dict()
print eng2sp
还可以给字典添加新项
eng2sp['one']='SS'
print eng2sp
或者直接赋值
eng2sp = {
'one':'1',
'two':"2",
'three':"3"
}
print eng2sp
print eng2sp['one']
len
可以用在字典上
print len(eng2sp)
如果一个键不在字典里面,输出就会报错,可以用in
判断
print 'one' in eng2sp
使用字典作为计数器
比如计算每个字幕出现次数
def histogram(s):
d = dict()
for i in s:
if i in d:
d[i] +=1
else:
d[i] = 1
return d
w = histogram("brontosaurus")
循环和字典
如果在for循环中使用字典,会遍历字典的键
def print_hist(h):
for c in h:
print c,h[c]
print_hist(w2)
反向查找
给定一个字典d和键k,找到v是很容易的。 但是给定值v 通过v来查找k 就没那么简单了,因为很可能多个k的值是同一个。
初级版本:
def reverse_lookup(d,v):
for k in d:
if d[k]==v:
return k
raise ValueError
字典和列表
列表可以在字典中以值得形式出现
例如
def invert_dict(d):
inverse = dict()
for key in d:
val = d[key]
if val not in inverse:
inverse[val] = [key]
else:
inverse[val].append(key)
return inverse ```
利用字典来实现缓存
我们之前的`fibonacci`函数 会重复计算一些已经计算过的值,那么我们建一个 字典 缓存起来,如果计算过 就返回这个值。
known = {0:0,1:1}
def fibonacci(n):
if n in known:
return known[n]
res = fibonacci(n-1)+fibonacci(n-2)
known[n]=res
return res
cache = {}
def ackermann(m, n):
if m == 0:
return n+1
if n == 0:
return ackermann(m-1, 1)
try:
return cache[m, n]
except KeyError:
cache[m, n] = ackermann(m-1, ackermann(m, n-1))
return cache[m, n]
练习
1. 读入'words.txt'并将单词以字典的形式存储
```
def get_words():
r = []
lin = open('words.txt')
for line in lin:
word = line.strip()
r.append(word)
return r
words = get_words()
def word2dict(w):
word = dict()
for i in range(len(w)-1):
word[w[i]]=True
return word
dict_word=word2dict(words)
利用字典get
方法,将histogram
写得更紧凑
def histogram_get(s):
d = dict()
for i in s:
t = d.get(i,0)
d[i] = t+1
return d
w2 = histogram_get("brontosaurus")
字典方法有一个keys,以列表的方式返回字典所有的键,修改print_hist
按照字典顺序打印字典的键和他们的值
def print_keys(h):
r = h.keys()
for i in r:
print i,h[i]
print_keys(w2)
修改reverse_lookup
使它建立一个包含所有映射到v键的列表
def reverse_lookup2(d,v):
r = []
for k in d:
if d[k]==v:
r.append(k)
return r
利用setdefault
来写个更简洁的invert_dict
def invert_dict2(d):
inverse = dict()
for key in d:
inverse.setdefault(d[key],[]).append(key)
return inverse
术语表