Python 语言及其应用 Chapter_5_Note_5 标准库杂项



使用有序字典OrderedDict()按键排序
在前面几章的代码示例中可以看出,一个字典中键的顺序是不可预知的:你可以按照顺序
添加键a、b 和c,但函数keys() 可能返回c、a 和b。下面是第1 章用过的一个例子:
>>> quotes = {
... 'Moe': 'A wise guy, huh?',
... 'Larry': 'Ow!',
... 'Curly': 'Nyuk nyuk!',
... }
>>> for stooge in quotes:
... print(stooge)
...
Larry
Curly
Moe
有序字典OrderedDict() 记忆字典键添加的顺序,然后从一个迭代器按照相同的顺序返
回。 试着用元组(键,值)创建一个有序字典:
>>> from collections import OrderedDict
>>> quotes = OrderedDict([
... ('Moe', 'A wise guy, huh?'),
... ('Larry', 'Ow!'),
... ('Curly', 'Nyuk nyuk!'),
... ])
>>>
>>> for stooge in quotes:
... print(stooge)
...
Moe
Larry
Curly






 双端队列:栈+队列
deque 是一种双端队列,同时具有栈和队列的特征。它可以从序列的任何一端添加和删除
项。现在,我们从一个词的两端扫向中间,判断是否为回文。函数popleft() 去掉最左边
的项并返回该项,pop() 去掉最右边的项并返回该项。从两边一直向中间扫描,只要两端
的字符匹配,一直弹出直到到达中间:
>>> def palindrome(word):
... from collections import deque
... dq = deque(word)
... while len(dq) > 1:
... if dq.popleft() != dq.pop():
... return False
... return True
...
...
>>> palindrome('a')
True
>>> palindrome('racecar')

True
>>> palindrome('')
True
>>> palindrome('radar')
True
>>> palindrome('halibut')
False
这里把判断回文作为双端队列的一个简单说明。如果想要写一个快速的判断回文的程
序,只需要把字符串反转和原字符串进行比较。Python 没有对字符串进行反转的函数
reverse(),但还是可以利用反向切片的方式进行反转,如下所示:
>>> def another_palindrome(word):
... return word == word[::-1]
...
>>> another_palindrome('radar')
True
>>> another_palindrome('halibut')
False



 使用itertools迭代代码结构
itertools(https://docs.python.org/3/library/itertools.html)包含特殊用途的迭代器函数。在
for ... in 循环中调用迭代函数,每次会返回一项,并记住当前调用的状态。
即使chain() 的参数只是单个迭代对象,它也会使用参数进行迭代:
>>> import itertools
>>> for item in itertools.chain([1, 2], ['a', 'b']):
... print(item)
...
1
2
a
b
cycle() 是一个在它的参数之间循环的无限迭代器:
>>> import itertools
>>> for item in itertools.cycle([1, 2]):
... print(item)
...
1
2
1
2
.
.
.
accumulate() 计算累积的值。默认的话,它计算的是累加和:
>>> import itertools
>>> for item in itertools.accumulate([1, 2, 3, 4]):
... print(item)

...
1
3
6
10
你可以把一个函数作为accumulate() 的第二个参数,代替默认的加法函数。这个参数函数
应该接受两个参数,返回单个结果。下面的例子计算的是乘积:
>>> import itertools
>>> def multiply(a, b):
... return a * b
...
>>> for item in itertools.accumulate([1, 2, 3, 4], multiply):
... print(item)
...
1
2
6
24
itertools 模块有很多其他的函数,有一些可以用在需要节省时间的组合和排列问题上。




关于cycle()这个,自己做了个测试,他的参数里面只能包含一个元素,不然会报错。




 使用pprint()友好输出
我们见到的所有示例都用print()(或者在交互式解释器中用变量名)打印输出。有时输
出结果的可读性较差。我们需要一个友好输出函数,比如pprint():
>>> from pprint import pprint
>>> quotes = OrderedDict([
... ('Moe', 'A wise guy, huh?'),
... ('Larry', 'Ow!'),
... ('Curly', 'Nyuk nyuk!'),
... ])
>>>
普通的print() 直接列出所有结果:
>>> print(quotes)
OrderedDict([('Moe', 'A wise guy, huh?'), ('Larry', 'Ow!'), ('Curly', 'Nyuk nyuk!')])
但是,pprint() 尽量排列输出元素从而增加可读性:
>>> pprint(quotes)
{'Moe': 'A wise guy, huh?',
'Larry': 'Ow!',
'Curly': 'Nyuk nyuk!'}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值