元组:元组是由一对括号和以逗号分隔的值组成。
存储一组数据,没有一旦创建,不能修改又称只读列表。
特性:
1.不可变
2.元组本身不可变,如果元组内还有其他可变的元素,这些可变元素是可以改变的。
创建:
>>> tup = () >>> tup () 当元组只有一个元素时,需要在元素后面加‘ , '。否则会被默认时变量赋值 >>> tup = ('a') >>> tup 'a' >>> tup = ('a',) >>> tup ('a',)
索引和切片
>>> tup = (1,2,3,'a','b','c') >>> tup.index("a") 3 >>> tup[1:4] (2, 3, 'a')
计数
>>> tup = (1,2,3,'a','b','c') >>> tup.count('a') 1
元组的循环:
>>> for i in tup: print(i) 1 2 3 a b c >>> for index,i in enumerate(tup): print(index,i) 0 1 1 2 2 3 3 a 4 b 5 c
字典dict:可变的数据类型
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组、布尔值。
字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
特性:
1.key-value结构,存储大量关系型数据。
2.key必须唯一,必须可哈希,也就是不可变类型
3.可存放任意多个值,value可以不唯一,可以修改
4.字典是无序的
5.查找速度特别快
创建
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> dic1 {'name': 'james', 'age': 18, 'sex': 'male'}
增加
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> dic1['high'] = 175 # 不存在key = 'high'才新增,如果存在就是覆盖 >>> dic1 {'name': 'james', 'age': 18, 'sex': 'male', 'high': 175}
dic1.setdefalut(key,value) # 字典中存在key,不做任何改变,不存在就新增,value不指定时默认为None
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1.setdefault("name",'JAMES') # 字典中存在key为'name'的键值对,直接返回key对应的值,字典没有改变
'james'
>>> dic1
{'name': 'james', 'age': 18, 'sex': 'male'}
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1.setdefault('weight',130) # 字典中不存在key = 'weight',就新增进去,返回value
130
>>> dic1
{'name': 'james', 'age': 18, 'sex': 'male', 'weight': 130}
删除
dic1.pop(key,x)
指定key值删除,如果key存在,返回key对应的value,x缺失的情况下,key不存在会报错。指定x,key不存在返回x,不会报错。
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> dic1.pop('age') # 不指定x,key存在返回key的value 18 >>> dic1 {'name': 'james', 'sex': 'male'}
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1.pop("high") # 不指定x,key不存在报错
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
dic1.pop("high")
KeyError: 'high'
如果指定了x,key不存在时,直接返回x;如果指定x,key存在就直接返回key对应的value(可设置返回值x)
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1.pop("high",178)
178
dic1.popitem() # 随机删除,有返回值,返回以元组形式的键值。
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1.popitem()
('sex', 'male')
del dic1.[key] # 按照指定的key删除键值,没有返回值,如果key不存在会报错
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> del dic1.['heigh']
SyntaxError: invalid syntax
del dic1 # 直接删除字典
dic1.clear() #清空列表
修改
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> dic1['name'] = 'JAMES' # 直接对指定的key值对应的value进行赋值修改 >>> dic1 {'name': 'JAMES', 'age': 18, 'sex': 'male'}
dic1.update(dic2) # 更新
把dic2的键值对更新到dic1中,相同key值的,覆盖掉dic1中的value,dic1中的没有的key,新增进去
dic1法生改变,dic2不发生改变
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic2 = {'name':'tony','heigh':178}
>>> dic1.update(dic2)
>>> dic1
{'name': 'tony', 'age': 18, 'sex': 'male', 'heigh': 178}
>>> dic2
{'name': 'tony', 'heigh': 178}
查询
dic1[key] 按照指定的key,找出对应的value,如果key不存在,会报错
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1['name']
'james'
dic1.get(key,x) 查找对应键的值,可设置返回值,x默认是None
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1.get('name') # 如果存在返回对应的value
'james'
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'}
>>> dic1.get('heigh','不存在') # 如果key不存在,返回x指定的值,x为空默认返回None
'不存在'
dic1.keys() 返回字典里面的全部key,以列表的形式返回
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> dic1.keys() dict_keys(['name', 'age', 'sex'])
dic1.values() 返回字典里面的全部value,以列表的形式返回
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> dic1.values() dict_values(['james', 18, 'male']) dic1.items() 把字典的键和值放进元组,以列表的形式返回 >>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> dic1.items() dict_items([('name', 'james'), ('age', 18), ('sex', 'male')])
循环
>>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> for i in dic1: # 打印的是key print(i) name age sex >>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> for i in dic1.keys(): # 打印的是key print(i) name age sex >>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> for i in dic1.values(): # 打印的是values print(i) james 18 male >>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> for k,v in dic1.items(): # 打印的是key 和 value (这个方法低效,是先把字典转成列表再循环打印) print(k,v) name james age 18 sex male >>> dic1 = {'name':'james', 'age':18, 'sex':'male'} >>> for i in dic1: print(i,dic1[i]) # 直接用dic1[i]取出value值 name james age 18 sex male
字典的其他方法
fromkeys
dict.fromkeys(seq[, value]) # 以seq为字典的key,value为键对应的值创建字典
seq可以是元组或者列表
value也可以是元组或者列表
>>> {}.fromkeys((1,2,3),(10,1))
{1: (10, 1), 2: (10, 1), 3: (10, 1)}
>>> {}.fromkeys((1,2,3),[10,1])
{1: [10, 1], 2: [10, 1], 3: [10, 1]}
>>> {}.fromkeys([1,2,3],10)
{1: 10, 2: 10, 3: 10}
>>> {}.fromkeys([1,2,3],[10,1])
{1: [10, 1], 2: [10, 1], 3: [10, 1]}
集合:可变的数据类型(空集合set())
特性:
1.去重,互异性,元素不重复
2.元素必须是不可变类型,可hash(数字、字符串、元组)
3.无序
创建
>>> set1 = set((123,)) # set()括号里可以是元组、列表、字符串 >>> set1 {123}
>>> set1 = set('a',)
>>> set1
{'a'}
>>> set1 = set('a',)
>>> set1
{'a'}
>>> set1 = set((123)) #### 当集合里面只有一个元素的时候需要加逗号创建,否则报错
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
set1 = set((123))
TypeError: 'int' object is not iterable
>>> set1 = {1,2,3,4} >>> set1 {1, 2, 3, 4}
增加
set1.add(元素) # 把元素加入集合
>>> set1.add('b')
>>> set1
{'a', 'b'}
set1.update(元素)把元素加到集合中,可以多个值,迭代添加
>>> set1 = {1,2,3,4}
>>> set1.update("cd")
>>> set1
{1, 2, 3,'d', 4, 'c'}
删除
set1.pop()随机删除,返回的是删除的值,集合为空的时候会报错
>>> set1 = {1,2,3,4} >>> set1.pop() 1
set1.discard(元素)没有返回值,没有指定的元素不会报错
>>> set1 = {1,2,3,4}
>>> set1.discard(1)
>>> set1
{2, 3, 4}
>>> set1 = {1,2,3,4} # 没有指定元素时不会报错
>>> set1.discard(100)
>>> set1 = {1,2,3,4}
>>> set1.remove(1) # 也可以用remove删除,没有元素会报错
>>> set1
{2, 3, 4}
循环集合,只能通过循环查找集合的元素
>>> for i in set1: print(i) 1 2 3 4
求交集(& 或者 intersection)
>>> set1 = {1,2,3,4} >>> set2 = {3,4,5,6} >>> set1.intersection(set2) {3, 4} >>> set1 & set2 {3, 4}
求并集(| 或者 union)
>>> set1 = {1,2,3,4} >>> set2 = {3,4,5,6} >>> set1.union(set2) {1, 2, 3, 4, 5, 6} >>> set1 | set2 {1, 2, 3, 4, 5, 6}
求差集 (- 或者 difference)
>>> set1 = {1,2,3,4} >>> set2 = {3,4,5,6} >>> set1 - set2 # set1独有的 {1, 2} >>> set2 - set1 # set2独有的 {5, 6} >>> set1 = {1,2,3,4} >>> set2 = {3,4,5,6} >>> set1.difference(set2) # 返回的时set1中出去两个集合相同的元素 {1, 2} >>> set2.difference(set1) # 返回的时set2中出去两个集合相同的元素
{5, 6}
对称差集 除去两个集合相同的元素(^ 或者 symmetric_difference)
>>> set1 = {1,2,3,4} >>> set2 = {3,4,5,6} >>> set1 ^ set2 {1, 2, 5, 6} >>> set1.symmetric_difference(set2) {1, 2, 5, 6}
判断一个集合是否是另一个集合的子集,子集与超集
set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1 < set2) print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set1) print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。
集合的其他方法:把集合变成不可变的数据类型
>>> set1=frozenset(set1) # 变成不可变数据类型不能删除 >>> set1 frozenset({2, 3, 4}) >>> set1.pop() Traceback (most recent call last): File "<pyshell#65>", line 1, in <module> set1.pop() AttributeError: 'frozenset' object has no attribute 'pop' >>> for i in set1: # 变成不可变数据类型,可以遍历循环 print(i) 2 3 4