1.dict(字典)
字典是另一种可变容器模型,且可存储任意类型对象。
1.字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,最后一个键值的逗号可以省略,整个字典包括在花括号 {} 中 。
2.键一般是唯一的,值不需要唯一,不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住。
3.值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
>>> dict={'a':1,'b':2,'c':3,}
>>> dict['b']
2
>>> dict1={'a':1,'b':2,'b':3}#出现重复键值
>>> dict1['b']
3
>>> dict2={'a':1,'b':2,'b':3}#出现重复值
>>> print(dict2)
{'a': 1, 'b': 3}
访问字典里的值
(dict使用key,而list 必须使用索引返回对应的元素)
>>> dict={'a':1,'b':2,'b':3}
>>>> print("dict['a']:",dict['a'])
dict['a']: 1
>>> list=['a','b','c']
>>> list[0]
'a'
当key不存在,会报错,为避免报错:
1.先判断一下 key 是否存在,用 in 操作符
2.使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None
3.利用dict内置的setdefault(key[,default])方法,如果key存在,则返回其value;否则插入此key,其value为default,并返回default
>>> dict={'a':1,'b':3}
>>> dict['c']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'c'
>>> if 'c' in dict:
print(dict['c'])#key不存在,不执行print
>>> print(dict.get('a'))#第二种方法
1
>>> print(dict.get('c'))
None
>>> print(dict.setdefault('c'))#第3种办法
None
>>> print(dict)
{'a': 1, 'b': 3, 'c': None}
修改字典
>>> dict={'a':1,'b':2,'c':3,}
>>> dict['a']=4 #修改键'a'
>>> print(dict)
{'a': 4, 'b': 2, 'c': 3}
>>> dict['d']=5 #添加key
>>> print(dict)
{'a': 4, 'b': 2, 'c': 3, 'd': 5}
删除
1.del命令
2.clear()
>>> dict={'a':1,'b':2,'c':3,}
>>> del dict['a']#删除键是'a'的条目
>>> print(dict)
{'b': 2, 'c': 3}
>>> dict.clear()#清空词典所有条目
>>> print(dict)
{}
字典内置函数
函数 | 例子及描述 |
cmp() | cmp(dict1, dict2) 比较两个字典元素。 |
len() | len(dict)计算字典元素个数,即键的总数。 |
str() | str(dict)输出字典可打印的字符串表示 |
type() | type(variable)返回输入的变量类型,如果变量是字典就返回字典类型。 |
遍历dict
set集合
集合(set)是一个无序的不重复元素序列,跟dict的key特点相似, 但是没有dict的value
创建集合
1.使用大括号 { } 创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典
2.set()函数:通过set()函数来创建set时, 需要通过列表,字典,元组,字符串来转换成set(注:set会自动的将重复的元素去除)
>>> type({})#当{}中没有任何元素时,python认为其是字典数据类型
<class 'dict'>
>>> a={1,2,3}#用大括号创建集合
>>> type(a)
<class 'set'>
>>>dict={'a':1,'b':2,'c':3,}#通过字典转换,只保留key值,会把value直接删除
>>>set1= set(dict)
>>>list=['1','2','3']#通过列表转换
>>>set2=set(list)
>>>tuple=(1,2,3,)#通过元组转换
>>>set3=set(tuple)
>>>str='1' #通过字符串转换
>>>set4=set(str)
>>>a=(1,2,2,3)#去除重复
>>>set5=set(a)
>>>print(set5)
{1, 2, 3}
添加元素
语法格式 :set.add( x )或set.update( x )
>>>dict={'a':1,'b':2,'c':3,}
>>>set1= set(dict)
>>>set1.add('d')
>>>print(set1)
>>>set1.update('e')
>>>print(set1)
{'d', 'a', 'b', 'c'}
{'a', 'd', 'c', 'e', 'b'}
移除元素
1.语法格式:set.remove( x ).
将元素 x从集合 set中移除,如果元素不存在,则会发生错误。
>>>dict={'a':1,'b':2,'c':3,}
>>>set1= set(dict)
>>>set1.remove('b')
>>>print(set1)
{'a', 'c'}
>>> dict={'a':1,'b':2,'c':3,}
>>> set1= set(dict)
>>> set1.remove('d')#移除不存在的
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'd'
2.语法格式:set.discard( x )
如果元素不存在,不会发生错误。
>>> dict={'a':1,'b':2,'c':3,}
>>> set1= set(dict)
>>> set1.discard('d')
>>>
3.语法格式:set.pop()
随机删除集合中的一个元素
>>> dict={'a':1,'b':2,'c':3,}
>>> set1= set(dict)
>>> set1.pop()
'c'
>>> print(set1)
{'a', 'b'}
(注:在交互模式,pop 是删除集合的第一个元素(排序后的集合的第一个元素))
4.语法格式:set.clear()
清空集合
>>> dict={'a':1,'b':2,'c':3,}
>>> set1= set(dict)
>>> set1.clear()
>>> print(set1)
set()
运算符的应用
>>> a=['1','2','3','4']
>>> b=['3','4','5','6']
>>> set1=set(a)
>>> set2=set(b)
>>> set3=set1-set2# 集合a中包含而集合b中不包含的元素(差集)
>>> set4=set1|set2# 集合a或b中包含的所有元素
>>> set5=set1&set2# 集合a和b中都包含了的元(and)
>>> set6=set1^set2# 不同时包含于a和b的元素
>>> print(set3)
>>> print(set4)
>>> print(set5)
>>> print(set6)
{'2', '1'}
{'2', '1', '3', '5', '4', '6'}
{'3', '4'}
{'2', '1', '5', '6'}
file文件读取
打开文件方式
open() 方法
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode=‘r’)
完整的语法格式为:
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file对象
file.close() # 关闭文件。关闭后文件不能再进行读写操作。
file.flush() # 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno() # 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
file.isatty() # 如果文件连接到一个终端设备返回 True,否则返回 False。
file.next() # 返回文件下一行。
file.read([size]) # 从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size]) # 读取整行,包括 “\n” 字符。
file.readlines([sizeint]) # 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
file.seek(offset[, whence]) # 设置文件当前位置
file.tell() # 返回文件当前位置。
file.truncate([size]) # 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
file.write(str) # 将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence) # 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
作业
读取一个文件【文件将在之后给出】,将文件中转换为字典,key值为学习项目,value值为一个负责人列表,并判断字典中是否有负责人负责多个学习项目。
dict = {} # 建立空字典
with open('E:/homework.txt', encoding='utf-8') as f: # 读取文件
# print(type(f)) # 查询类型
# print(dir(f)) # 查询方法
for line in f.readlines():
word = line.strip() # 去除\n
group = word.split()[0] # 提取key值
name_list = [word.split()[1], word.split()[2]] # 提取value值
dict[group] = name_list
all_name_list = []
for group in dict.keys():
name_list = dict.get(group) # 获取到学习项目的负责人列表
for _name in _name_list:
all_name_list.append(_name) # 将当前学习营的人员加入总列表
print(_all_name_list)
# set去重 对比长度就知道有没有重复了
if len(set(_all_name_list)) - len(_all_name_list) !=0:
print("重复了")
else:
print("没有重复")