Python_字典

字典

1.定义:
字典可看作是索引(这里称为键)的集合与值的集合之间存在的一种映射。

  • 而字典中的索引几乎可以是任意类型,与列表不同,列表中索引位置必须为整数
  • 每个键对应一个值,键与值之间的关系称之为键值对,有时也称为数据项

2.字典的创建与输入输出

  • dict()函数可以创建一个空字典,大括号{}表示一个空字典
  • 使用方括号[]向字典里添加数据项
    例:
a = dict()
print(a)
a['one'] = 'uno'
print(a)
{}
{'one': 'uno'}
  • 也可直接创建
    例:
d = {"one":1, "two":2, "three":3}
print(d)
d = dict(one='A', two='B', three='C')
print(d)
   {'one': 1, 'two': 2, 'three': 3}
   {'one': 'A', 'two': 'B', 'three': 'C'}

3.字典采用键来查找对应的值
字典的顺序往往是不可预测的
例:

eng2sp = {'one': 'uno','two': 'dos','three':'tres'}
print(eng2sp)
{'one': 'uno', 'three': 'tres', 'two': 'dos'}

字典项并不是用整数来索引,而是采用键来查找对应的值。如果查找的键不存在字典里,会得到一个异常提醒。
例:

eng2sp = {'one': 'uno','two': 'dos','three':'tres'}
print(eng2sp['two'])
           dos      #”two”对应的值是”dos”,这与字典项的顺序无关

4.字典类型操作函数和方法
len(d) 返回字典d中元素的个数
例:

eng2sp = {'one': 'uno','two': 'dos','three':'tres'}
print(len(eng2sp))
      3

del d[k] 删除字典d中键k对应的键值对

k in d 判断键k是否在字典d中,如果在返回True,否则False
例1:

d = {'one': 'uno','two': 'dos','three':'tres'}
'one' in d
     Ture

例2:

d = {'one': 'uno','two': 'dos','three':'tres'}
'uno' in d
       False    #判断键是否在字典中而非值,此处无名为’uno’的键
       -在字典中in操作符运算,Python采用了一种很有效的哈希表算法。这种算法不管字典里里面有多少数据项,时间花费上几乎没有差别

d.keys()返回字典中所有的键信息,返回一个迭代器,可以使用 list() 来转换为列表。
例:

dict = {'Name': 'Runoob', 'Age': 7}
dict.keys()
dict_keys(['Name', 'Age'])
list(dict.keys())             # 转换为列表
['Name', 'Age']

d.values()返回字典d中所有的值信息,返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值
例:

ict = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
print ("字典所有值为 : ",  list(dict.values()))
字典所有值为 :  ['female', 'Zara', 7]

d.items()以列表返回可遍历的(键, 值) 元组数组
例:

dict = {'Name': 'Runoob', 'Age': 7}
print ("Value : %s" % dict.items())
 Value : dict_items([('Name', 'Runoob'), ('Age', 7)])

利用items遍历
例:

dict = {'Name': 'Runoob', 'Age': 7}
for i,j in dict.items():
      print(i, ":\t", j)
        Name :   Runoob                  
         Age :    7

将字典的键与值组成一个新的列表
例:

d={1:"a",2:"b",3:"c"}
result=[]
for k,v in d.items():
result.append(k)
result.append(v)
print(result)
[1, 'a', 2, 'b', 3, 'c']

get(k,) 函数返回指定键k的值,如果键不在字典中返回值。
例:

dict = {'Name': 'Runoob', 'Age': 27}
print ("Age 值为 : %s" %  dict.get('Age'))
print ("Sex 值为 : %s" %  dict.get('Sex', "NA"))
Age 值为 : 27
Sex 值为 : NA

pop() 方法删除字典给定键 key 及对应的值,返回值为被删除的值。如果键不在字典中default 值。
例:

site= {'one': 'uno','two': 'dos','three':'tres'}
pop_obj=site.pop('one')
print (pop_obj) 
print(site)
uno
{'two': 'dos', 'three': 'tres'}

d.clear()删除所有的键值对

5.字典作为计时器
-假设给定一个字符串,想要知道其中每个字符出现的次数?
-创建一个以字符为键,其出现次数作为值得字典。首次遇到一个字符,将其作为一个数据项添加到字典里。之后,遇到字典里已存在的数据项,就对其值加1。
-字典实现的一个优点在于,我们不必先知道字符串中出现了那些字符,只需为确定会出现的字母分配空间就好了。
例:

word = 'brontosaurus'
d = dict()
for c in word:
   if c not in d:
       d[c] = 1
   else:
       d[c] = d[c] + 1
print (d)
{'b': 1, 'r': 2, 'o': 2, 'n': 1, 't': 1, 's': 2, 'a': 1, 'u': 2}

利用get方法
例:

word = 'brontosaurus'
d = dict()
for c in word:
       d[c] = d.get(c,0) + 1    
print (d)
{'b': 1, 'r': 2, 'o': 2, 'n': 1, 't': 1, 's': 2, 'a': 1, 'u': 2}

if条件和in操作的循环与get方法的循环之间的区别。两者可以实现同样的目的,但是后者更加简洁

6.字典与文件
-对书面文字的文本文件进行词频统计是字典的常见用法之一。
-先对不包含标点符号的简化短文本操作:
But soft what linght through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
-分析:读取上述文件的每一行,并将每一行分解为由单词组成的列表。然后,遍历每个单词,使用字典来统计每一个单词的出现次数
例:

fname = raw_input('Enter the file name: ')      #raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收),将所有输入作为字符串看待,返回字符串类型。
try:
    fhand = open(fname)
except:
    print('File cannot be opened:',fname)
    exit()

counts = dict()
for line in fhand:
    words = line.split()
    for word in words:
        if word not in counts:
            counts[word] = 1
        else:
            counts[word] += 1
print(counts)
  • 这个程序包含两个for循环,这就是所谓的嵌套循环,外部循环用来读取文件中每一行,内部循环迭代该行的每一个单词。
  • 外部循环每迭代一次,内部循环都会执行它全部的迭代。
  • 基于这一点,我们认为内部循环比外部循环迭代地’更快’。两个嵌套循环的组合确保了输入文件的每一行的每一个单词都会被统计到
  • 运行程序,生成一个包含全部计数的原始文件,输出没有排序的哈希序列

7.数据对的排序
-按键的单词字母顺序输出字典的数据对:

counts = {'chuck' : 1,'annie' : 42,'jan' : 100}
lst = list(counts.keys())
print(lst)
lst.sort()       #sort函数默认升序排列
for key in lst:
           print (key,counts[key])
['chuck', 'annie', 'jan']
annie 42
chuck 1
jan 100
         -首先使用字典key方法,将所有的键放入一个列表。然后,用sort()方法对这个列表进行排序。最后依次输出

-按值的大小顺序输出字典的数据对:

counts = {'chuck' : 1,'annie' : 42,'jan' : 100}
lst = list(counts.items())
print(lst)
lst.sort(key = lambda lst: lst[1])    #运用lambda函数得到第二个值,再规定按第二个值排序
for i,j in lst:
       print(i, ":\t", j)
[('chuck', 1), ('annie', 42), ('jan', 100)]
chuck :	 1
annie :	 42
jan :	     100
        -首先使用字典items方法,将所有的键值对放入一个列表。然后,用sort()方法对这个列表进行排序。最后依次输出

8.高级文本解析
-文本词频统计
英语文本:Hamet
link.
例:

#CalHamletV1.py
def getText():
    txt = open("hamlet.txt","r").read()    #文本形式,打开hamlet.txt,只读模式,一次读入,统一处理
    txt = txt.lower()        #将全文字符串转化为小写字母
    for ch in '!"#$&()*+,-./:;<=>?@[\\]^_‘{|}~':
        txt = txt.replace(ch," ")    #找出全文特殊符号,如果有以上字符,用空格” ”将其代替
    return txt     #返回一个只有小写字母与空格的txt文本
hamletTxt = getText()     #调用函数,并把值给hamletTxt
words = hamletTxt.split()    #将文本分解为多个单个的字符串(单词)
counts = {}       #定义一个空字典counts
for word in words:
    counts[word] = counts.get(word,0) + 1     #向空字典里添加键值对,把每个单个字符串与对应次数形成键值对
it = list(counts.items())     #用items方法返回可遍历的(键, 值) 元组数组,再用list方法转化列表
it.sort(key = lambda x:x[1],reverse = True)     #运用lambda函数得到第二个值,再规定按第二个值排序
for i in range(10):
    word,count = it[i]
    print("{0:<10}{1:>5}".format(word, count))     #显示items中前10对”单词  次数”

9. jieba库
优秀的中文分词第三方库

  • 中文文本需要通过分词获得单个的词语
  • jieba是优秀的中文分词第三方库,需要额外安装
  • jieba库提供三种分词模式,最简单只需要掌握一个函数
  • jieba分词依靠中文词库
  • 利用一个中文词库,确定汉字之间的关联概率
  • 汉字间概率大的组成词组,形成分词结果
  • 除了分词,用户还可以添加自定义的词组

jieba分词的三种模式

  • 精确模式:把文本精确的切开分开,不存在冗余单词
    • 全模式:把文本中所有可能的词语都扫描出来,有冗余
    • 搜索引擎模式:在精确模式基础上,对长词再次切分

jieba库常用函数
-jieba.lcut(s) 精确模式,返回一个列表类型的分词结果
例:

import jieba
jieba.lcut("中国是一个伟大的国家")
['中国', '是', '一个', '伟大', '的', '国家']

-jieba.lcut(s,cut_all=True) 全模式,返回一个列表类型的分词结果,存在冗余
例:

import jieba
jieba.lcut("中国是一个伟大的国家",cut_all=True)
 ['中国', '国是', '一个', '伟大', '的', '国家']

-jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型的分词结果,存在冗余
例:

import jieba
jieba.lcut_for_search("中华人民共和国是伟大的")
 ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']

-jieba.add_word() 向分词词典增加新词w
例:

jieba.add_word(“斜眼笑”)

实例:
中文文本:《三国演义》 ,分析人物名字出现次数排序
link.
例:

#CalThreeKingdomsV1.py
import jieba
txt = open("threekingdoms.txt","r",encoding = "utf-8").read()
words = jieba.lcut(txt)
counts = {}
for word in words:
              if len(word) == 1:
                  continue
              else:
                  counts[word] = counts.get(word,0) + 1
its = list(counts.items())
its.sort(key = lambda x:x[1],reverse = True)
for i in range(15):
              word,count = its[i]
              print("{0:<10}{1:>5}".format(word,count))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值