字典

字典类似于列表,但更加通用

键值对 ,字典是 键与值之间的映射,每个键都映射到一个值上

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

ackermann 也可以简历一个缓存

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)
2. 利用字典`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")
3. 字典方法有一个keys,以列表的方式返回字典所有的键,修改`print_hist`按照字典顺序打印字典的键和他们的值
def print_keys(h):
r = h.keys()
for i in r:
print i,h[i] print_keys(w2)
4. 修改`reverse_lookup`使它建立一个包含所有映射到v键的列表
def reverse_lookup2(d,v):
r = []
for k in d:
if d[k]==v:
r.append(k) return r
5. 利用`setdefault`来写个更简洁的`invert_dict`
def invert_dict2(d):
inverse = dict()
for key in d:
inverse.setdefault(d[key],[]).append(key)
return inverse

术语表
- 字典(dictionary):从键的集合到对应的值的集合的映射
- 键值对(key-value pair):键到值得映射的战士
- 项(item):键值对的另一个名称
- 键(key):字典中出现在键值对的前一部分的对象
- 值(value):字典中出现在键值对后一部分的对象
- 实现(implementation):进行计算的一个具体方式
- 散列表(hashtable):python字典的是先用的算法
- 散列函数(hash function):散列表中用来计算一个键的位置的函数
- 可散列(hashable):拥有散列函数的类型
- 查找(lookup):字典的一个操作,接受一个键,并找到它对应的值。
- 反向查找(reverse lookup):字典的一个操作,通过一个值来找到它对应的一个或多个键
- 单件(singleton):只包含一个元素的列表
- 直方图(histogram):一个计数器的集合
- 备忘(memo):将计算结果存储起来,以避免将来进行不必要的计算
- 标志(flag):用于标记一个条件是否为真的布尔变量

think in python 11 字典的更多相关文章

  1. Python的字典

    1.  Python的字典 1.1.  字典的定义 在Python中,字典是一种key-value的数据类型,也是唯一的映射类型:字典还是另一种可变容器类型,且可存储任意类型对象,其中也可包括其他容器 ...

  2. python基础--字典

    Python基础--字典 字典的常用函数: dict.clear( )--->无任何返回值 说明: 清除字典内的所有的元素 语法: In [5]: dict.clear? Type: metho ...

  3. python入门-字典

    1 python是使用{}来表示字典 字典是一系列的键值对 alien_0={} 2 访问字典中的值 new_point = alien_0['point'] print("you just ...

  4. 深入Python(1): 字典排序 关于sort()、reversed()、sorted()

    http://www.cnblogs.com/BeginMan/p/3193081.html 一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠 ...

  5. python中字典排序

    一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...

  6. Python中字典和集合

    Python中字典和集合 映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元 ...

  7. Python的字典和JSON

    Python的字典和JSON在表现形式上非常相似 #这是Python中的一个字典 dic = { 'str': 'this is a string', 'list': [1, 2, 'a', 'b'] ...

  8. Python dictionary 字典 常用法

    Python dictionary 字典 常用法 d = {} d.has_key(key_in)       # if has the key of key_in d.keys()          ...

  9. python有序字典OrderedDict()

    转python创建有序字典OrderedDict # -*- coding:utf-8 -*- """ python有序字典 需导入模块collections " ...

随机推荐

  1. libaio under MIPS architecture /在mips架构下使用的libaio

    First, you can find libaio source in http://libaio.sourcearchive.com/ Second,download the libaio_0.3 ...

  2. poj 2774 最长公共子--弦hash或后缀数组或后缀自己主动机

    http://poj.org/problem?id=2774 我想看看这里的后缀数组:http://blog.csdn.net/u011026968/article/details/22801015 ...

  3. Hadoop中SequenceFile的使用

    1.对于某些应用而言,须要特殊的数据结构来存储自己的数据. 对于基于MapReduce的数据处理.将每一个二进制数据的大对象融入自己的文件里并不能实现非常高的可扩展性,针对上述情况,Hadoop开发了 ...

  4. Android实战技巧之十九:android studio导出jar包(Module)并获得手机信息

    AS中并没有独立的Module 工程,可是能够在普通的Project中增加Module.所谓的Module就是我们通常所指的模块化的一个单元.并经常以jar包的形式存在.以下以一个获取手机信息的样例演 ...

  5. windows 下使clion支持c++11操作记录

    最近用上了windows下的clion,发现默认安装的MINGW版本太低,导致所带的gcc版本竟然是3.5的,实在太老了,不支持c++11,于是手动修改了mingw的版本.首先去mingw的官网下载最 ...

  6. PHP中的的一个挺好用的函数 array_chunk

  7. CAS SSO

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  8. MVC调试异常--未能将脚本调试器附加到计算机

    32位机: 解决办法:以管理员身份打开CMD,运行:regsvr32.exe "%ProgramFiles(x86)%\Common Files\Microsoft Shared\VS7De ...

  9. android:padding和android:margin的区别

    Android的Margin和Padding跟Html的是一样的.如下图所示:黄色部分为Padding,灰色部分为Margin. 通俗的理解: Padding 为内边框,指该控件内部内容,如文本/图片 ...

  10. [Linked List]Partition List

    Total Accepted: 53879 Total Submissions: 190701 Difficulty: Medium Given a linked list and a value x ...