使用有序字典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!'}