python的数据类型可以分为三种:
数值:
序列:字符串 元祖 列表
散列:字典、集合 #特征 内部元素是无序的
(特别注意:python3.7之后字典不再无序,字典变成了有序的)
元祖和列表的比较:
占用内容方面:
列表为可变的序列,在分配时,会先预分配一个空间,当数值超过一定数量时,会进行扩容。
元祖在分配空间时为定值,占用内容空间更小。
速度方面:
可以通过ipython来进行耗时的测试
deafaulttimer默认跑一千万次
list = ['1','2','3','4','5']
import timeit
res = timeit.Timer('list').timeit(1000)
print(res)
res1 = timeit.timeit('list')
print(res1)
命名元祖
让元祖像字典一样可以通过名称获取
Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值:
collections.namedtuple(typename, field_names)
返回一个命名元组类 typename,其中参数的意义如下:
typename:类名称
field_names: 元组中元素的名称
如何定义命名元祖
from collections import namedtuple
#方法一
test_tuple = namedtuple('test_tuple',['name','age','sex'])
#方法二
test_tuple1 = namedtuple('test_tuple1','name age sex')
命名元组的属性和方法
1,命名元组类的属性和方法类属性
_fields:包含这个类所有字段名的元组类方法
_make(iterable):接受一个可迭代对象来生产这个类的实例
# 通过类方法 _make() 和一个list创建一个User对象
user = User._make(['joker', 'male', 12])
User._fields
2,命名元组实例的方法实例方法
_asdict():把具名元组以 collections.OrdereDict 的形式返回,可以利用它来把元组里的信息友好的展示出来实例方法_replace():用于修改实例的属性
# 获取实例的属性:
print( user.name, user.sex, user.age)
# 使用 _replace() 修改对象属性
user = user._replace(age=22)# User(name='user1', sex='male', age=22)
# 使用 _asdict()函数把 User对象转换成字典
print( user._asdict() )
# OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])
把字典或列表转换为命名元组
1,把字典转换为命名元组
可以把Python的字典转换为命名元组:
>>> dt={'name':'b', 'age':2, 'id':135}
>>> ut=User(**dt)
## User(name='b', age=2, id=135)
2,把列表转换为命名元组
使用map函数,调用命名元组类的_make函数,把列表转换为命名元组的列表
User = namedtuple('User', 'name age id')
list_users=map(User._make,[('u1',23,1001),('u2',21,1002),('u3',25,1003),])
3,把命名元组转换为列表也可以把命名元组转换为list,列表中只有值,而没有字段名称:
>>> list(ut)
['b', '2', 135]
访问命名元组
通过逗号运算符和属性名来访问元组字段的值,例如,ut是命名元组的对象,name是对象的属性,可以通过以下方式访问元组的name属性:
ut.name
命名元组的用途
命名元组在存储csv或者sqlite3返回数据的时候特别有用
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
print(emp.name, emp.title)
import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
print(emp.name, emp.title)
字典和集合的原理和应用
原理
dict与set实现原理是一样的,都是将实际的值放到list中,唯一不同的在于hash函数操作的对象,对于dict,hash函数操作的是其key,而对于set是直接操作的它的元素,假设操作内容为x,其作为因变量,放入hash函数,通过运算后取list的余数,转化为一个list的下标,此下标位置对于set而言用来放其本身,而对于dict则是创建了两个list,一个list表放置key,另一个list中该下标方对应的value。其中,我们把实现set的方式叫做Hash Set,实现dict的方式叫做Hash Map/Table(注: map指的就是通过key来寻找value的过程)
散列类型的存储过程
当存在重复值时,会引起散列冲突,解决冲突的方法有两种:
一、扩容
二、在该位置新建一个链表,把值存入链表中
字典查找值的过程
性能分析:
从时间上比较(快到慢):集合 字典 元祖 列表
占用内存比较(多到少):字典 集合 列表 元祖