isinstance(object,object_type)
用来检测一个object对象是不是一个object_type类型.所以isinstance(object,abc.Mapping)
用来检测object是不是映射类型.
例程示例了字典的推导:
#创建一个列表,元素为集合
DIAL_CODES = [
(86, 'China'),
(91, 'India'),
(1, 'United States'),
(62, 'Indonesia'),
(55, 'Brazil'),
(92, 'Pakistan'),
(880, 'Bangladesh'),
(234, 'Nigeria'),
(7, 'Russia'),
(81, 'Japan'),
]
#拆分DIAL_CODES里面的代码,code 到 code,country 到 country
#注意到,country_code 和 DIAL_CODES 的 country 和 code 的顺序是相反的
country_code = {country:code for code,country in DIAL_CODES}
print(country_code,end="\n\n\n")
country_code_2 = {code:country.upper()
for country,code in country_code.items()
if code <76}
print(country_code_2)
输出:
{'China': 86, 'India': 91, 'United States': 1, 'Indonesia': 62, 'Brazil': 55, 'Pakistan': 92, 'Bangladesh': 880, 'Nigeria': 234, 'Russia': 7, 'Japan': 81}
{1: 'UNITED STATES', 62: 'INDONESIA', 55: 'BRAZIL', 7: 'RUSSIA'}
可以通过集合的items()
方法来获取一个可迭代的列表,然后用if
来限制条件.
使用 setdefault
可以节省一些操作:
"""创建从一个单词到其出现情况的映射"""
import sys
import re
WORD_RE = re.compile('[a-zA-Z]+')
index = {}
with open("zen.txt", encoding='utf-8') as fp:
for line_no, line in enumerate(fp, 1):
for match in WORD_RE.finditer(line):
word = match.group()
column_no = match.start()+1
location = (line_no, column_no)
index.setdefault(word, []).append(location)
# 以字母顺序打印出结果
for word in sorted(index, key=str.upper):
print(word, index[word])
这里我修改了正则表达式的内容,由于我们日常的文本很可能含有汉字,所以不能直接使用w+
来提取,否则会把汉字的句子一句一句也提取出来
enumerate()
(参考enumerate)这里,生成一个带序号的列表,具体可以查看参考中的示例协助理解.
for match in WORD_RE.finditer(line):
根据设置好的规则([a-zA-Z]+
)逐行查看,如果找到就记录下来,最后连接行列数,这里只有match.start()+1,是计算它的位置,及首字母出现在第几列,行数不需要,他在enmuerate
就已经生成了.
如果查询到某个不存在的键值,我们希望它就给我们返回某一个默认的值,可以使用defaultdict
这个类型,也可以在自定义的dict
的子类中,通过特殊方法__missing__
方法来实现,
如果要自定义一个映射类型,通过集成collections.UserDict()
类来实现
方法 | 含义 |
---|---|
collections.OrdereDict | 添加建的时候会保持顺序,OrdereDict默认删除或者返回最后(最前)一个元素,感觉合适做队列或者栈 |
collections.ChainMap | 容纳不同的映射对象 |
collections.Counter | 一个计数器 |
collections.UserDict | 用 python 实现标准的 dict |
UserDict | 比dict方便一些 |
标准库中所有的映射类型都是可以改变的,MappingProxyType
可以返回一个试图,这样就不会修改到原来的映射