think python学习笔记(14)

字典和元组
字典中有一个叫做items的方法,它返回由多个元组组成的序列,其中每个元组是一个键值对

d = {'a':0,'b':1,'c':2}
t = d.items()

其结果是一个dict_items对象,这是一个对键值对进行迭代的迭代器,可以在for循环中这样使用它

for key,value in d.items():
	print(key,value)

由于是字典生成的对象,所以这些项是无序的

也可以使用元组的列表初始化一个新的字典

d = dict(t)

将dict与zip结合使用,可以简洁的创建一个字典

d = dict(zip('abc',range(3)))

字典的update方法也接受元组列表,并将其作为键值对添加到已有的字典中去
在字典中使用元组作为键的做法很常见(键不能使用列表)
例如,一个电话簿可能会基于用户的姓名对,来映射至号码

directory[last,first] = number

方括号中的表达式是一个元组。我们可以通过元组赋值来遍历这个字典

for last,first in directory:
	print(first,last,directory[last,first])

该循环遍历电话簿中的键,键是元组。
循环将元组的元素赋给last和first,然后打印出对应的值。

在状态图中有两种表示元组的方法,详细的版本是,索引号和对应元素就像列表一样存放在元组中。
在更大的图标中,可能就会省略掉索引

序列嵌套
在很多情况下,不同类型的序列可以互换使用。因此,我们该如何选择合适的序列。
首先,字符串比其他序列限制更多,因为它的所有元素都必须是字符,且字符串不可变,如果希望改变字符串中的字符,使用列表嵌套字符或许会更合适。

列表比元组更常用,主要是因为它们是可变的。但是有些情况下,可能更倾向于使用元组:
1.在一些情况下(例如return语句)从句式上生成一个元组比列表更简单
2.如果想使用一个序列作为字典的键,那么必须使用元组或者字符串这样的不可变类型
3.如果向函数传入一个序列作为参数,那么使用元组可以降低由于别名产生的意外行为的可能性

由于元组的不可变性,它们没有类似(sort)和(reverse)这样修改现有列表的方法。
然而python提供了内建函数sorted和reversed,前者可以接受任意序列,并返回一个正序排列的新列表,后者则接受一个序列,返回一个可逆序迭代列表的迭代器

调试
列表,字典和元组都是数据结构,本章解除了复合数据结构,嵌套结构,使用时容易出现形状错误,也就是由于数据结构的类型,大小和结构问题而引发的错误。
例:当希望引入一个正数组成的列表时,接收的是一个纯粹的整数,就会出现错误

structshape模块,接收任意类型的数据结构作为实参,然后返回一个描述它形状的字符串

from structshape import structshape
t = [1,2,3]
structshape(t)
>'list of 3 int'

案例研究:数据结构的选择
随机数
给定相同的输入,大多数计算机程序每次都会产生相同的输出,它们因此被称为确定性的,
但是对于有些应用,我们希望计算机不可预知。
让程序具备真正意义上的非确定性并不容易,但是有办法使它看起来是不确定的。
其中之一就是使用生成的伪随机数的算法。伪随机数不是真正的随机数,因为它们由一个确定的计算生成,但是仅看其生成的数字,不可能将它们和随机生成的区分开。

random模块提供了生成伪随机数的函数
函数random返回一个0.0到1.0之间的随机浮点数(包括0.0,但是不包括1.0)。每次调用random,将获得一个长序列中的下一个数

import random
for i in range(10):
	x = random.random()
	print(x)

函数randint接受参数low和high,返回一个low和high之间的整数(两端都包括)

random.randint(5,10)

也可以使用choice,从一个序列中随机选择一个元素

t = [1,2,3]
random.choice(t)

random模块提供的函数,还可以生成符合高斯,置数,伽马等连续分布的随机值

单词直方图

import string
def process_file(filename):
	hist = dict()
	fp = open(filename)
	for line in fp:
		process_line(line,hist)
	return hist

def process_line(line,hist):
	line = line.replace('-',' ')
	for word in line.spilt():
		word = word.strip(string.punctuation + string.whitespace)
		word = word.lower()
		hist[word] = hist.get(word,0) + 1

hist = process_file('emma.txt')

processfile循环读取文件的每行,依次把它们传递给processline。直方图list被当做一个累加器
processline使用字符串replace方法将连字符替换成空格,然后用spilt将一行文件切分成一个字符串列表。之后遍历单词列表,并使用strip和lower删除标点并且将单词转换成小写
重点:转换只是一种说法,字符串是不可变的,所以类似strip和lower这样的方法其实是返回新字符串
最后,processline通过生成一个新的项或者递增一个已有的项来更新直方图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值