Python中的字典(二)

#字典初始化,快速填充字典的value值,创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(默认为None)

举例说明:

字典初始化,分数都设置为0,字典会自动去重,字典快速初始化,快速将学生的分数都填充为0
d ={}
l ={'zhangsan','list','tiantian'}
print d.fromkeys(l,0)
print d.fromkeys(l) #不填None
输出:{'tiantian': 0, 'zhangsan': 0, 'list': 0}

{'tiantian': None, 'zhangsan': None, 'list': None}

#字典合并,adict.update(bdict) 将字典bdict的键值对添加到字典adict中

key存在,就更新value。key不存在就新增数据项字典合并,

例子:

d1= {'k3': 3, 'k2': 2, 'k1': 1}
d2={'k4': 3, 'k7': 2,}
d1.update(d2)
print d1
输出:{'k3': 3, 'k2': 2, 'k1': 1, 'k7': 2, 'k4': 3}
运算 :字典不支持拼接和重复操作符(+,*) 字典的比较操作长度等、键等、值等

字典的迭代

遍历字典的key     for key in adict.keys():print key
遍历字典的value     for value in adict.values(): print value

遍历字典的项    for item in adict.items():print item

dic = {'name':'zhangsan','id':2,'salary':2000}
for i in dic.keys():
    print i
for v in dic.values():
    print v
for i,v in dic.items():
    print i,v
练习题:#去除字典中value重复的项    {'zhangsan':100, 'lisi':65, 'tianlaoshi':65, 'liulaoshi':99}

#去除字典中value重复的项 {'zhangsan':100, 'lisi':65, 'tianlaoshi':65, 'liulaoshi':99}
dict1={'zhangsan':100, 'lisi':65, 'tianlaoshi':65, 'liulaoshi':99}
lista =dict1.values()
for k,v in dict1.items():
    if dict1.values().count(v)>1:
        del dict1[k]
print dict1
dic = {'zhangsan':100, 'lisi':65, 'tianlaoshi':65, 'liulaoshi':99}
    b = dic.copy()
    a = []
    for key,value in dic.items():
        if value in a:
            del b[key]
        else:
            a.append(value)
    print(b)
排序:同列表

注意:这几种排序方式都是#对字典转存之后的数据进行排序的,对dict.items()的对元组进行排序,

dict.values()是对列表进行排序的,字典本身是无法进行排序的

sorted(dic,value,reverse)
dic为可以迭代的对象,value 为排序的对象(这里指键或键值)
reverse:注明升序还是降序,True--降序,False--升序(默认)
键排序 --sorted(dict.keys()) --sorted(dict.items(), key=lambda item:item[0])
值排序--sorted(dict.values())  --sorted(dict.items(), key=lambda item:item[1])

sort函数和sorted函数的区别重点::!!!!!!!!
sort是原地操作,用于在原位置度列表进行排序。 在原位置意味着列表会被修改,sort()方法的返回值并不是序列本身,而是None

sorted:.拷贝后再排序,不改变序列本身

下面这个用的比较少,
类型转换
其他类型转字典:
字符串:eval(str)
列表:二维列表转换  手动构造  利用zip
字典转列表:
list(dic) == dict.keys()
dict.keys() dict.values()

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
list1=dict.keys()
list2=dict.values()
print list1,list2
输出:

['Age', 'Name', 'Class'] [7, 'Zara', 'First']

字典转元组:
tuple(dic) -- 只包含key值

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print tuple(dict)
输出:('Age', 'Name', 'Class'),只包含key的数值字典转字符串:
str(dic)

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print str(dict)
练习一:
编写一组数据,记录组内每个人的语文成绩
data = {
'JiaNaiLiang': 60,
'LiXiaoLu': 75,
'TianLaoShi': 99,
'MaSu': 88,
'KongLingHui': 35,
'LiuLaoShi': 100
}
a.算出平均分

b.再找出学霸

dic = {'JiaNaiLiang': 60,'LiXiaoLu': 75,'TianLaoShi': 99,'MaSu': 88,'KongLingHui': 35,'LiuLaoShi': 100}
listValues=dic.values()
sum=0.0
for i in listValues:
    sum+=i
    avg=sum/len(listValues)
print '平均分是%.2f'%avg
score1=max(listValues)
score2=min(listValues)
for name,score in dic.items():
    if score==score1:
        print '学霸是%s'%name
    elif score==score2:
        print '学渣是%s'%name
    else:
        break
第二种方法:通过sorted排序

data = {
'JiaNaiLiang': 60,
'LiXiaoLu': 75,
'TianLaoShi': 99,
'MaSu': 88,
'KongLingHui': 35,
'LiuLaoShi': 100
}
result=sorted(data.items(),key=lambda x:x[1],reverse=True)
print '学霸是:%s'%result[0][0]
print '学渣是:%s'%result[-1][0]
练习二:
编写一组数据,记录组内每个人的语文成绩、数学成绩、英语成绩    
data = {'JiaNaiLiang': [60, 68, 45], 'LiXiaoLu': [10, 28, 5],'TianLaoShi': [44, 86, 73],'MaSu': [99, 95, 95],'KongLingHui': [98, 65, 100],'LiuLaoShi': [77, 97, 65]}

a.找到平均分不足60分的人

data = {
'JiaNaiLiang': [60, 68, 45],
'LiXiaoLu': [10, 28, 5],
'TianLaoShi': [44, 86, 73],
'MaSu': [99, 95, 95],
'KongLingHui': [98, 65, 100],
'LiuLaoShi': [77, 97, 65]
}
#找到平均分不足60分的人
for name,score in data.items():
    sum =0.0
    for i in score:
        sum+=i
        avg=sum/len(score)
    if avg<60:
        print '平均分不足60分的人是%s'%name
b.找出各科的最高分:创建列表的方式,然后通过max函数找出最高分数

data = {
'JiaNaiLiang': [60, 68, 45],
'LiXiaoLu': [10, 28, 5],
'TianLaoShi': [44, 86, 73],
'MaSu': [99, 95, 95],
'KongLingHui': [98, 65, 100],
'LiuLaoShi': [77, 97, 65]
}
chinese=[]
math=[]
english=[]
for score in data.values():
    chinese.append(score[0])
    math.append(score[1])
    english.append(score[2])
print '语文的最高分数是%d'%max(chinese)
print '数学的最高分数是%d'%max(math)
print '英语的最高分数是%d'%max(english)
c.算出各科的平均分,再找出各科的学霸

比较简单的计算平均分:上面是通过sum直接除len长度的方法,下面这种是通过循环的方法,求平均数的

print '语文最平均分:%.2f, 数学平均高分:%.2f, 英语平均高分:%.2f' \
      % (sum(chinese)/float(len(chinese)),sum(math)/float(len(math)),sum(english)/float(len(english)))
c =0.0
for i in chinese:
    c+=i
print '语文的平均分是%.2f'%(c/len(chinese))

m =0.0
for j in math:
    m+=j
print '数学的平均分是%.2f'%(m/len(math))

e =0.0
for n in english:
    e+=n
print '英语的平均分是%.2f'%(e/len(english))
各科的学霸:思路:重组字典,把每科成绩和人名按照字典组合,然后通过sorted的方式,排序求出学霸

data = {
'JiaNaiLiang': [60, 68, 45],
'LiXiaoLu': [10, 28, 5],
'TianLaoShi': [44, 86, 73],
'MaSu': [99, 95, 95],
'KongLingHui': [98, 65, 100],
'LiuLaoShi': [77, 97, 65]
}
dicChinese={}
dicMath={}
dicEnglish={}
for x,y in data.items():
    dicChinese[x]=y[0]
    dicMath[x]=y[1]
    dicEnglish[x]=y[2]
print '语文的字典是%s'%dicChinese
print '数学的字典是%s'%dicMath
print '英语的字典是%s'%dicEnglish
print '语文的学霸是%s'%sorted(dicChinese.items(),key=lambda x:x[-1],reverse=True)[0][0]
print '数学的学霸是%s'%sorted(dicMath.items(),key=lambda x:x[-1],reverse=True)[0][0]
print '英语的学霸是%s'%sorted(dicEnglish.items(),key=lambda x:x[-1],reverse=True)[0][0]
#统计一篇英文文章每个单词的出现频率,并返回出现频率最高的前5个单词及其出现次数(字典形式)
str1='A small sample of texts from Project Gutenberg appears in the NLTK corpus collection. However, you may be interested in analyzing other texts from Project Gutenberg. You can browse the catalog of 25,000 free online books at http://www.gutenberg.org/catalog/, and obtain a URL to an ASCII text file. Although 90% of the texts in Project Gutenberg are in English, it includes material in over 50 other languages, including Catalan, Chinese, Dutch, Finnish, French, German, Italian'
list1= str1.lower().split(' ')
dic1={}
for x in list1:
    if x in dic1.keys():
        dic1[x]+=1
    else:
        dic1[x]=1
# print dic1
print sorted(dic1.items(),key=lambda x:x[-1],reverse=True)[:5]

版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值