下面我们讨论Python基本数据类型中的字典和集合。
6.1 字典
我们都使用过汉语字典,它的原理是对汉语中的每个字,都给出对应的释义并组词、造句。与汉语字典相似,在Python中也提供了字典这一数据类型。它是一个复合类型,即,它可以包含多个元素。但与列表和元组不同的是,它不以下标对元素进行索引,而是将元素组织成一个个键-值对,以键作为下标,索引字典中的元素,其中的键是互不相同的不可变值( 不可变值的概念第7章将进行讨论 )。字典的用法如下:
>>> d={"father": "Jack", # 逗号分隔字典的元素
"mother": "Jane", # 冒号以 "键:值" 的形式组织元素,一个键-值对是一个元素
"son" : "Henry"} # 键是互不相同的不可变值
>>> d["son"] # 通过键对元素进行索引
"Henry"
d.keys() 方法返回字典的键列表,如: 在for循环中使用字典
for key in d.keys():
do sth. with d[key]
字典中的元素并不一定按照我们创建时的顺序排列,而是由Python自行决定如何排列,使用时不能假定键存在某个顺序,但有时我们需要按键的一定顺序对字典元素进行访问,我们可以这样做:
for key in sorted(d.key()): # 按字母顺序排列键,
# 对上例中的字典,就是
do sth. with d[key] # ['father','mother','son']的顺序
# reverse=True表示逆序排列,reverse是逆序的意思
for key in sorted(d.key(), reverse=True)
do sth. with d[key] # keys按 ['son', 'mother',
# 'father'] 的顺序排列
我们可以使用工厂函数创建一个空字典:
工厂函数可以简单地理解成前面讲过的类的初始化函数__init__(),当我们直接用类名作为函数名进行调用时,实际上调用的就是该类的__init__()函数。它的作用是像工厂生产产品一样生产该类的一个个对象。比如:
d=dict() # dict()是字典类的工厂函数,此处生成了一个空字典
生成空字典后,如何向字典中添加元素呢? 我们不需要像列表的l.append()函数一样的方法,而只需进行赋值操作即可,比如:
>>> d=dict()
>>> d["father"]="Jack"
>>> d["mother"]="Jane"
>>> d["son"]="Henry"
>>> d
{'father': 'Jack', 'mother': 'Jane', 'son': 'Henry'}
字典的作用是根据键的值快速访问对应的元素,就像一本几十万字的字典,掌握了使用它的方法之后,查阅一个字的释义就很快捷了。
那么,怎么删除字典的元素呢? 答案如下:
>>> d.clear() # 清除字典中的所有元素
>>> d.pop("father") # 删除其中一个元素,提供键即可
6.2 集合
有时,我们需要一个容器,要求其中的元素都是唯一的,集合提供了这个功能。集合中的元素是互不相同的不可变值,这个要求与字典中的键相同。
要使用集合,可以用工厂函数先创建一个空集合
>>> some_set=set()
然后向该集合中添加元素:
>>> some_set.add("father")
>>> some_set.add("mother")
>>> some_set.add("son")
>>> some_set
{'father', 'son', 'mother'}
也可以用赋值的方法创建一个集合:
>>> some_set={"father", "mother", "son"}
删除元素,可以使用remove()方法:
>>> some_set.remove("father")
>>> some_set
{"mother", "son"}
6.3 综合例子: 统计英语文章中的词频
f=open("article.txt",'r')
wordlist=[]
for line in f.readlines():
wordsOfLine=line.split()
wordlist+=wordsOfLine # 用全部文本生成一个单词列表
wordsSet=set(wordlist) # 利用wordlist构造一个集合,
# 去除其中的重复元素
wordCount=dict()
for word in wordsSet:
wordCount[word]=wordlist.count(word)
for wc in sorted(wordCount.items(),
key=lambda item: item[1],
reverse=True): # 对wordCount按词频排序
print("%s: %d" % wc) # wc是一个二元组(word, count)
网友评论