python基础—dict

'''
概述:   类似java中的map
使用键值对(key-value)存储,具有极快的查找速度
1、字典中的key必须唯一,不唯一时,只有一个有效且随机
2、key必须是不可变对象
3、字符串、整数等都是不可变的,可以作为key
4、list可变,不能作为key,列表和字典不能作为key
  布尔能作为key,但是有可能会和0,1重复
5、字典是无序的 (不能使用角标),每次print都不一样
'''
from collections import defaultdict
from collections import OrderedDict
from collections import Counter
dict1 = {'Tom':40,'Pat':49,'lilei':68}
# 元素的访问
# 获取:字典[key]   没有key会报错
print(dict1['Tom'])

# get(key[,val])根据键取值,更好,键不存在时不会报错,且第二个参数为返回值,默认None
print(dict1.get('Pat'))

# setdefault(key,value) 设置默认键值,如果字典中有键值对时,保持原来的状态,参数中的值作废,没有则添加新的键值对
# 而且不可同过该方法修改(默认)值
dict1.setdefault('luowenlong',65)
print(dict1)

# defaultdict(func) 用于创建值为默认(/指定)数据类型的空字典,参数为具有返回值的函数,可自行追加没有的键
# 例如默认为int型时,没有的键,初始值为0(只是默认);其他的数据类型也可以作为值(value类型仍可修改)
dictA=defaultdict(int)
dictA['a']=1
dictA['b']=2
print(dictA)
print(dictA['c'])

# dict.fromkeys([],value)    根据列表中的元素为key,第二个参数为value,创建多个同值不同键的字典元素
dic =dict.fromkeys(['fajo','jfoi',456],234)
print(dic)

# 添加
dict1['hanmeimei']=99
# 因为一个key对应一个value,所以,多次对一个key的value赋值,其实就是改值
dict1['lilei']=80
print(dict1)

# update()合并字典,如果合并时键重了,则键对应的值会被覆盖
dict3={"a":1,'b':2}
dict4={'c':3,'d':4}
dict3.update(dict4)    # 无返回值,不能进行赋值,否则为None
dict3.update(e=5)       # 也能添加成功
print(dict3)

# 删除
#  pop(key) del(key) 删除key所在的键值对信息,但是pop()会返回删除的键所对应的值
# popitem() 随机删除一个数据,应返回被删除的数据
# dict.del('Pat')
f=dict1.pop('Pat')
print(dict1)
print(f)
# clear()清除所有元素
# del dict[key]

# 遍历
for key in dict1:
    print(key,dict1[key])
# keys()     返回以指定字典的键为元素的列表dict_keys([……])
# values()   返回以指定字典的值为元素的列表dict_values([……])
for value in dict1.values():
    print(value)
print(dict1.values())
# items()     返回以指定字典的每一对键值对作为一个元组然后作为元素的列表,数据类型为:dict_items
for k,v in dict1.items():
    print(k,v)
print(dict1.items())

# 字典虽是无序的,但可有序遍历
# (1)按键的添加的顺序返回,但是其物理地址是无序的
for i,v2 in enumerate(dict1,1):  # 序号+key,第二个参数是角标的起始数字,默认为0
    print(i,v2)
    print(id(i),id(v2))
print(enumerate(dict1))
for i,v in enumerate(dict1.items()):  # 序号+(key,value)
    print(i,v)
# (2)按键的添加的顺序返回
dictF = OrderedDict([('face',100),('money',10000),('color','red'),('foot','chicken')])
for i in dictF:
    print(i)


# dict可以将任何包含双值子序列的序列转换成字典
a = dict([[1,2],[3,4],[5,6]])
print(a)
b=dict(([1,2],[3,4],[5,6]))
print(b)
c=dict(['ab','cd','ef'])
print(c)
d=dict(('ab','cd','ef'))
print(d)

'''
# zip()并行迭代     且zip会在最短序列用完时停止
listA=[1,2,3,4]
tupleB=('11','22','33')
for li,tu in zip(listA,tupleB):
    print(li,tu)
'''
# zip可以将两个任意序列进行匹配,调用dict可以转成字典

listA=[1,2,3,4]
tupleB=('11','22','33','44')
C=zip(listA,tupleB)
dictD=dict(C)
print(C)
print(list(C))           # 空
print(dictD)

'''
dict和list比较
dict:
1、查找和插入的速度极快,不会随着key-value 的增加而变慢
2、需要占用大量的内存,内存浪费

list;
1、查找和插入的速度会随着数据量的增加而变慢
2、占用空间小,浪费内存少 
'''

'''
对一段英文进行处理,将每个单词及其个数存入字典:
1、以空格切割字符串
2、循环处理列表中的每个元素
3、以元素当做key在字典中提取数据
4、如果没有提取到,就以该元素作为key,1作为value存进字典
5、如果提取到,将对应的key修改,值加1
6、根据输入的字符串当做key再去字典中取值
'''
dict2={}  # 存的是单词及其对应的个数
str = '''I am a good man! I am a nice man! I am a
      good boy! I am a nice boy! I 
      am a handsome man!I am a 
      good man! I am a good guy!'''
l= str.split(' ')
for v in l:
    c = dict2.get(v)
    if c == None:
        dict2[v] = 1
    else :
        dict2[v]+=1
print(dict2)

'''
利用Counter(list)可以统计可重复序列中各元素的个数,以Conuter('字典')形式返回
方法:
most_commn([num]) 降序排列返回元组,如果给一个数字,则返回排序后以此数为角标的元组之前的元组元素
'''
list1=[1,1,1,1,1,3,4,5,4,2,2,5,6,3,4,2,1]
count = Counter(list1)
print(count)
print(count.most_common())
print(count.most_common(2))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值