1. 字典
Python内置了字典,使用键-值(key-value)存储,具有极快的查找速度。主要有以下三个特性:
- 键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一
- 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组
- 查找和插入的速度极快,不会随着key的增加而变慢;但需要占用大量的内存,内存浪费多
1.1 基本操作
# 访问
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print "dict['Name']: ", dict['Name']
print "dict['Age']: ", dict['Age']
# 修改
dict['Age'] = 8 # 更新
dict['School'] = "RUNOOB" # 添加
#删除
del dict['Name'] # 删除键是'Name'的条目
dict.clear() # 清空词典所有条目
del dict # 删除词典
1.2 遍历
#只对键的遍历
d = {'name1' : 'pythontab', 'name2' : '.', 'name3' : 'com'}
for key in d:
print (key, ' value : ', d[key])
# name1 value : pythontab
# name2 value : .
# name3 value : com
#对键和值都进行遍历
#如果只需要值,用d.values;如果想获取所有的键则可以使用d.keys;如果想获取键和值d.items方法会将键-值对作为元组返回,for循环的一大好处就是可以循环中使用序列解包。
for key, value in d.items():
print (key, ' value : ', value)
# name1 value : pythontab
# name2 value : .
# name3 value : com
2. set集合
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.
sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。
2.1 创建及集合
#创建
>>> x = set('spam')
>>> y = set(['h','a','m'])
>>> x, y
(set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))
>>> x & y # 交集
set(['a', 'm'])
>>> x | y # 并集
set(['a', 'p', 's', 'h', 'm'])
>>> x - y # 差集
set(['p', 's'])
2.2 去除海量列表里重复元素,应用set案例
>>> a = [11,22,33,44,11,22]
>>> b = set(a)
>>> b
set([33, 11, 44, 22])
>>> c = [i for i in b]
>>> c
[33, 11, 44, 22]
2.3 set基本操作
t.add('x') # 添加一项
s.update([10,37,42]) # 在s中添加多项
t.remove('H') #删除一项
len(s) #set s的长度
x in s #测试 x 是否是 s 的成员
x not in s #测试 x 是否不是 s 的成员
s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中
s.union(t)
s | t
返回一个新的 set 包含 s 和 t 中的每一个元素
s.intersection(t)
s & t
返回一个新的 set 包含 s 和 t 中的公共元素
s.difference(t)
s - t
返回一个新的 set 包含 s 中有但是 t 中没有的元素
s.symmetric_difference(t)
s ^ t
返回一个新的 set 包含 s 和 t 中不重复的元素
s.copy()
返回 set “s”的一个浅复制
3. file文件读取
3.1读取文件
打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的):
>>> f = open('test.txt', 'r')
#标示符'r'表示读,这样,我们就成功地打开了一个文件
如果文件不存在,open()函数就会抛出一个IOError的错误,如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:
>>> f.read()
'Hello, world!'
#read()会一次性读取文件的全部内容
#read(size)每次最多读取size个字节的内容
#readline()可以每次读取一行内容
#readlines()一次读取所有内容并按行返回list
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
>>> f.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,Python引入了with语句来自动帮我们调用close()方法:
with open('/path/to/file', 'r') as f:
print(f.read())
3.2写入文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件
>>>with open('/Users/michael/test.txt', 'w') as f
>>> f.write('Hello, world!')
>>> f.close(
以’w’模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果我们希望追加到文件末尾以传入’a’以追加(append)模式写入。
3.3 Python 操作excel 和csv
需要找时间再学习下《数据科学手册》里Pandas的内容……
4. 作业
读取一个text文件,将文件中转换为字典,key值为学习项目,value值为一个负责人列表,并判断字典中是否有负责人负责多个学习项目。
dict={}
value1 = []
with open('Data/homework.txt', 'r',encoding='UTF-8') as f: #r是只读 w是写模式
for line in f.readlines():
word = line.strip()
key = word.split(' ')[0]
value = [word.split(' ')[1], word.split(' ')[2]]
value1 += value #所有负责人添加进列表
dict[key] = value
print("字典排列为:%s"%dict)
print("*"*30) #分隔符
if len(set(value1)) == len(value1):
print("每个负责人只负责一个项目")
else:
print("有负责人负责多个学习项目")
输出结果为:
字典排列为:{'python学习': ['咖喱', '胡骞'], 'leetcode刷题': ['老表', '陈焕森'],
'编程集训': ['孙超', '小熊'], '统计学': ['李奇峰', '蓝昔'],
'ML项目实践': ['杨冰楠', '孙涛'], '高级算法梳理': ['于鸿飞', '小雪'],
'基础算法梳理': ['sm1les', '钱令武'], '知乎小组': ['李严', '黑桃'],
'学习群': ['咖喱', '排骨']}
******************************
有负责人负责多个学习项目