python:5:字典

第一章:python

第五节: 字典及相关函数

1,字典基本用法

字典是键值的映射关系;在字典中,必须存在键值对,键和值之间必须用冒号分隔
>>> d={}#创建一个空字典
>>> d={'name': 'earth', 'port': 80}#存在两个键值对
可以用内建函数fromkeys()创建具有相同值的字典
>>> d={}.fromkeys(('x', 'y'), -1)#或者如下方法
>>> d={}.fromkeys(('x', 'y'), -1)
>>> d
{'y': -1, 'x': -1}
可以利用keys()和values()函数查看字典中的键值
>>> d={'name': 'earth', 'number': 80}
>>> d.keys()#以列表形式输出
['name', 'number']
>>> d.values()
['earth', 80]
也可以查看字典中某个键对应的值
>>> d['name']
'earth'
可通过原有字典的键值反转,产生原有字典键为值,值为键的一个新字典
>>> d2={}
>>> for k,v in d.items():
... ····d2[v]=k
len()可查看键值对数目,len(dict)

2,字典类型内建函数

dict.clear()
删除字典中的所有元素
dict.has_key(key)
判断字典中是否存在这个key,存在返回True,不存在返回False
dict.fromkeys(seq, val=None)
创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值
>>> d={'age': 27, 'name': 'zhen'}
>>> l=['age', 'name']
>>> dict.fromkeys(l,)
{'age': None, 'name': None}
>>> dict.fromkeys(d.keys(), d.values())
{'age': [27, 'zhen'], 'name': [27, 'zhen']}

dict.get(key, default=None)
对字典dict中的键key,返回它对应的值value,如果字典中不存在此键则返回default的值(注意,参数default的默认值为None)
>>> d={'length': 180, 'age': 27, 'name': 'zhen'}
>>> d.get('length', 'no this element')
180
>>> d.get('face', 'no this element')
'no this element'

dict.keys()
返回一个包括字典中键的列表

dict.values()
返回一个包含字典中值的列表

dict.items()
返回一个包含字典中键值对元组的列表
>>> d={1:2,3:4}
>>> d.items()
[(1, 2), (3, 4)]

dict.pop(key[, default])
和方法get()相似,如果字典中key键存在,删除并返回dict[key];如果key键不存在,则由dict[key]=default为他赋值;但如果没有给出default值,则引发KeyError异常
>>> d={1: 2, 3: 4, 5: 6}
>>> a=d.pop(1)
>>> a
2
>>> d
{3: 4, 5: 6}
>>> d.pop('length', 'no this element')
'no this element'

dict.update(dict2)
将字典dict2的键值对添加到字典dict中,相当于合并两个字典
>>> d={'age': 27, 'name': 'zhen'}
>>> d2={'length': 180}
>>> d.update(d2)
>>> d
{'length': 180, 'age': 27, 'name': 'zhen'}

3,创建字典

方法 1
已知两个列表,创建列表元素之间关系的字典
>>> list1=['length', 'age', 'name', 'weight']
>>> list2=[180, 27, 'zhen', 120]
>>> dict(zip(list1, list2))
{'length': 180, 'age': 27, 'weight': 120, 'name': 'zhen'}
方法 2
利用for循环创建键值对关系
>>> d={}#先定义一个空字典
>>> for x in range(len(list1)):
... ····d[list1[x]]=list2[x]#字典中产生映射关系
>>> d
{'length': 180, 'age': 27, 'weight': 120, 'name': 'zhen'}
注意:
第一点声明:作为字典的键必须是可哈希的,即字典的键必须有唯一的值,字典内不允许存在两个相同的键,但可以存在两个相同的值,所以说上述作为字典键的list1的各元素必须是唯一的;
第二点声明:既然字典是一种映射关系,不存在列表的元素排列关系,所以list1当中的元素位置在生成字典之后元素顺序会打乱。

3,实例,读取文件,并根据对应关系生成字典

文件内容如下,list文件
LD7d9821_S19_L001_R1_001.fastq.gz Chan7
LD7d9832_S19_L001_R2_001.fastq.gz Tate8
(文件分为一行,文件和名称中间以制表符连接)
>>> all=[x.strip() for x in open('list')]
>>> d={}
>>> for x in range(len(all)):
... ····d[all[x].split('\t')[0]]=all[x].split('\t')[1]
>>> d
{'LD7d9832_S19_L001_R2_001.fastq.gz': 'Tate8', 'LD7d9821_S19_L001_R1_001.fastq.gz': 'Chan7'}

数字计数并返回字典,利用defaultdict模块
>>> from collections import defaultdict
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...····d[k] += 1
...····
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
最终返回一个字典d,其keys为字符串的名称,values为字符串出现的个数。
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]#列表内的成对元组
>>> d = defaultdict(list)
>>> for k, v in s:
...····d[k].append(v)
...····
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
最终返回一个字典,其keys为原始元组的keys,而values为原始元组的value合并到一个列表。

4,json保存.json格式文件即读取.json格式文件

如果想要将字符串的内容直接保存成为字典,则不需要将字符串的内容保存成为普通的txt文件,再从新生成字典了。所以建议将脚本中的字典格式内容直接保存成为json格式文件,下次读取json文件内容的时候直接是字典形式的。
例如:
import json
range_dict={}
for line in open(file):
····for x in range(start, end):
········range_dict['%s:%s'%(chrom, x)]=None
json_str = json.dumps(range_dict)#将字典对象直接变成字符串
new_dict = json.loads(json_str)#将dict的字符串直接变成字典对象
with open('opt.json','w') as opt_file:
····json.dump(range_dict, opt_file)#将字典内容直接写入json文件的命令json.dump(dict, openfile)
new_dict=json.load(open('read.json', encoding='utf-8'))#读取json文件,json格式文件用open生成open文件对象,直接赋值给字典。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值