python----基础之数据类型(元祖,字典,集合)
元祖:
元祖的定义和特性
定义:列表已经介绍过,现在介绍一种与类表相似的类型,叫做元祖,只不过把[]改成()。
特性:
1.可以存放多个指
2.不可变
3.按照从左往右的顺序定义元祖的元素,下标从0开始依次顺序访问,有序
元祖的创建与常用类型
1 # 创建 2 >>> we = (11, 22, 33, 44, 55) 3 >>> we 4 (11, 22, 33, 44, 55) 5 >>> type(we) 6 <class 'tuple'> 7 >>> tuple((11,33,44)) 8 (11, 33, 44)
常用操作
# 索引取值 >>> we (11, 22, 33, 44, 55) >>> we[0] 11 >>> we[-1] 55 >>> we[2] 33
# 遍历 >>> for k in we: ... print(k) ... 11 22 33 44 55
len方法,切片,包含等方法与列表一样
元祖的特性:
1.可存放多个值
如果元祖中只有一个值
# 元祖中如果只存在一个值,要这样写 >>> a = (1) >>> type(a) # 这样写,python默认判断为是一个int类型的 <class 'int'> >>> a = (1,) >>> type(a) # 这样写,python才可以判断为是元祖类型 <class 'tuple'>
元祖中不仅可以可以存放数字,字符串,还可以存放更加复杂的数据类型.
2.不可变
元祖本身不可变,如果元祖中还包含其他可变的元素,这些可变的元素可以改变.
1 >>> a = (1,2,3,4,[5,6,7,8]) 2 >>> a 3 (1, 2, 3, 4, [5, 6, 7, 8]) 4 >>> a[2] = 9 5 Traceback (most recent call last): 6 File "<stdin>", line 1, in <module> 7 TypeError: 'tuple' object does not support item assignment 8 >>> a[4][0] = 9 9 >>> a 10 (1, 2, 3, 4, [9, 6, 7, 8]) 11 >>> a[4][1] = 10 12 >>> a 13 (1, 2, 3, 4, [9, 10, 7, 8]) 14 >>>
字典:
字典的定义与特性
字典是python语言中唯一的映射类型.
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
定义:
{key1:value1,key2:value2}
1.键与值之间用':'隔开;
2.项与项之间用','隔开;
特性:
1.key-value结构
2.key必须科hash,且必须为不可变数据类型,必须唯一
3.可存放任意多个值,可修改,可以不唯一
4.无序
字典的创建与常见操作
字典的创建
1 >>> pep = {'name':'alex', 'age':18} 2 >>> pep 3 {'name': 'alex', 'age': 18} 4 >>> pep = dict(name='ike',age=18) 5 >>> pep 6 {'name': 'ike', 'age': 18} 7 >>> pep = dict({'name':'joke','age':5}) 8 >>> pep 9 {'name': 'joke', 'age': 5}
1 >>> dic = {}.fromkeys(['k1','k2'],[]) 2 >>> dic 3 {'k1': [], 'k2': []} 4 >>> dic['k1'].append(22) 5 >>> dic 6 {'k1': [22], 'k2': [22]} 7 >>> dic['k2'].append(220)
字典的常见操作
键、值、键值对 1、dic.keys() 返回一个包含字典所有KEY的列表; 2、dic.values() 返回一个包含字典所有value的列表; 3、dic.items() 返回一个包含所有(键,值)元祖的列表; 4、dic.iteritems()、dic.iterkeys()、dic.itervalues() 与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表; 新增 1、dic['new_key'] = 'new_value'; 2、dic.setdefault(key, None) ,如果字典中不存在Key键,由 dic[key] = default 为它赋值;_ 删除 1、dic.pop(key[,default]) 和get方法相似。如果字典中存在key,删除并返回key对应的vuale;如果key不存在,且没有给出default的值,则引发keyerror异常; 2、dic.clear() 删除字典中的所有项或元素; 修改 1、dic['key'] = 'new_value',如果key在字典中存在,'new_value'将会替代原来的value值; 2、dic.update(dic2) 将字典dic2的键值对添加到字典dic中 查看 1、dic['key'],返回字典中key对应的值,若key不存在字典中,则报错; 2、dict.get(key, default = None) 返回字典中key对应的值,若key不存在字典中,则返回default的值(default默认为None) 循环 1、for k in dic.keys() 2、for k,v in dic.items() 3、for k in dic 长度 1、len(dic)
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。
如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d['Michael'] 95
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
dict就是第二种实现方式,给定一个名字,比如'Michael'
,dict在内部就可以直接计算出Michael
对应的存放成绩的“页码”,也就是95
这个数字存放的内存地址,直接取出来,所以速度非常快。
你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。
把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:
>>> d['Adam'] = 67 >>> d['Adam'] 67
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
>>> d['Jack'] = 90 >>> d['Jack'] 90 >>> d['Jack'] = 88 >>> d['Jack'] 88
如果key不存在,dic就会报KeyError错误:
>>> d['Thomas'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'Thomas'
要避免key不存在的错误,有两种办法,一是通过in
判断key是否存在:
>>> 'Thomas' in d False
二是通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value:
>>> d.get('Thomas') >>> d.get('Thomas', -1) -1
注意:返回None
的时候Python的交互环境不显示结果。
要删除一个key,用pop(key)
方法,对应的value也会从dict中删除:
>>> d.pop('Bob') 75 >>> d {'Michael': 95, 'Tracy': 85}
字典的工厂函数
1 class dict(object): 2 """ 3 dict() -> new empty dictionary 4 dict(mapping) -> new dictionary initialized from a mapping object's 5 (key, value) pairs 6 dict(iterable) -> new dictionary initialized as if via: 7 d = {} 8 for k, v in iterable: 9 d[k] = v 10 dict(**kwargs) -> new dictionary initialized with the name=value pairs 11 in the keyword argument list. For example: dict(one=1, two=2) 12 """ 13 def clear(self): # real signature unknown; restored from __doc__ 14 """ D.clear() -> None. Remove all items from D. """ 15 pass 16 17 def copy(self): # real signature unknown; restored from __doc__ 18 """ D.copy() -> a shallow copy of D """ 19 pass 20 21 @staticmethod # known case 22 def fromkeys(*args, **kwargs): # real signature unknown 23 """ Returns a new dict with keys from iterable and values equal to value. """ 24 pass 25 26 def get(self, k, d=None): # real signature unknown; restored from __doc__ 27 """ D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. """ 28 pass 29 30 def items(self): # real signature unknown; restored from __doc__ 31 """ D.items() -> a set-like object providing a view on D's items """ 32 pass 33 34 def keys(self): # real signature unknown; restored from __doc__ 35 """ D.keys() -> a set-like object providing a view on D's keys """ 36 pass 37 38 def pop(self, k, d=None): # real signature unknown; restored from __doc__ 39 """ 40 D.pop(k[,d]) -> v, remove specified key and return the corresponding value. 41 If key is not found, d is returned if given, otherwise KeyError is raised 42 """ 43 pass 44 45 def popitem(self): # real signature unknown; restored from __doc__ 46 """ 47 D.popitem() -> (k, v), remove and return some (key, value) pair as a 48 2-tuple; but raise KeyError if D is empty. 49 """ 50 pass 51 52 def setdefault(self, k, d=None): # real signature unknown; restored from __doc__ 53 """ D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """ 54 pass 55 56 def update(self, E=None, **F): # known special case of dict.update 57 """ 58 D.update([E, ]**F) -> None. Update D from dict/iterable E and F. 59 If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] 60 If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v 61 In either case, this is followed by: for k in F: D[k] = F[k] 62 """ 63 pass 64 65 def values(self): # real signature unknown; restored from __doc__ 66 """ D.values() -> an object providing a view on D's values """ 67 pass
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
>>> key = [1, 2, 3] >>> d[key] = 'a list' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
集合:
认识集合
集合是一个数学概念:由一个或多个确定的元素所构成的整体叫做集合。
集合中的元素有三个特征:
1.确定性,(元素必须科hash)
2.互异性(去重)
3.无序性(集合中的元素没有先后之分),比如:{123},{213}算作是一个集合
注意:集合存在的意义就在于去重和关系运算,有自动过滤的功能
集合解决的问题
>>> w = {'张三','李四','王五','joker'} # 定义一个集合 >>> e = {'张三','李四','王五','janny'} >>> we = w&e >>> we {'李四', '张三', '王五'}
集合的定义
1 l= {1,2,3,1} # 此处应说明集合“去重”的效果 2 # 定义可变集合 3 >>> set_test=set('hello') # 此处应说明集合的“无序性” 4 >>> set_test 5 {'l', 'o', 'e', 'h'} 6 # 改为不可变集合frozenset 7 >>> f_set_test=frozenset(set_test) 8 >>> f_set_test 9 frozenset({'l', 'e', 'h', 'o'})
集合的关系运算
交集:&或intersection
>>> w = {'张三','李四','王五','joker'} # 定义一个集合 >>> e = {'张三','李四','王五','janny'} >>> we = w&e >>> we {'李四', '张三', '王五'}
并集:|或union
1 >>> a = {'张三','李四','janny'} 2 >>> b = {'张三','李四','joker'} 3 >>> a.union(b) 4 {'janny', '张三', '李四', 'joker'} 5 >>> print(a|b) 6 {'janny', '张三', '李四', 'joker'}
差集:-或difference
1 >>> a = {'张三','李四','janny'} 2 >>> b = {'张三','李四','joker'} 3 >>> a 4 {'张三', '李四', 'janny'} 5 >>> b 6 {'张三', '李四', 'joker'} 7 >>> a.difference(b) 8 {'janny'} 9 10 >>> a 11 {'张三', '李四', 'janny'} 12 >>> b 13 {'张三', '李四', 'joker'} 14 >>> print(b-a) 15 {'joker'}
对称差集:^或symmetric_difference
1 >>> a = {1,2,3,4} 2 >>> b={1,2,3,4,5,6} 3 >>> a.symmetric_difference(b) 4 {5, 6} 5 >>> a^b 6 {5, 6}
包含关系:
1、in,not in:判断某元素是否在集合内
2、==,!=:判断两个集合是否相等
两个集合之间一般有三种关系,相交、包含、不相交。在Python中分别用下面的方法判断:
- set.isdisjoint(s):判断两个集合是不是不相交
- set.issuperset(s):判断集合是不是包含其他集合,等同于a>=b
- set.issubset(s):判断集合是不是被其他集合包含,等同于a<=b
集合的常用操作
元素的增加
单个元素的增加 : add(),add的作用类似列表中的append
对序列的增加 : update(),而update类似extend方法,update方法可以支持同时传入多个参数:
>>> a = {1,2} >>> a.update([3,4],[5,6,8,7]) >>> a {1, 2, 3, 4, 5, 6, 7, 8} >>> a.update('hello') >>> a {1, 2, 3, 4, 5, 6, 7, 8, 'l', 'h', 'e', 'o'} >>> a {1, 2, 3, 4, 5, 6, 7, 8, 'l', 'h', 'e', 'o'} >>> a.add('hello') >>> a {1, 2, 3, 4, 5, 6, 7, 8, 'l', 'h', 'e', 'hello', 'o'}
元素的删除
集合删除单个元素有两种方法:
元素不在原集合中时:
set.discard(x)不会抛出异常
set.remove(x)会抛出KeyError错误
>>> a = {1,2,3,45,6} >>> a.discard(1) >>> a {2, 3, 6, 45} >>> a.discard(1) >>> a {2, 3, 6, 45} >>> a.remove(3) >>> a.remove(3) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 3
pop():由于集合是无序的,pop返回的结果不能确定,且当集合为空时调用pop会抛出KeyError错误,
clear():清空集合
>>> a={3,"a",2.1,11,2,3,4,5} >>> a {2, 3, 'a', 4, 5, 11, 2.1} >>> a.pop() 2 >>> a.pop() 3 >>> a.pop() 'a' >>> a.pop() 4 >>> a {5, 11, 2.1} >>> a.clear() >>> a set() >>> a.pop() Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'pop from an empty set'
集合的工厂函数
1 class set(object): 2 """ 3 set() -> new empty set object 4 set(iterable) -> new set object 5 6 Build an unordered collection of unique elements. 7 """ 8 def add(self, *args, **kwargs): # real signature unknown 9 """ 10 Add an element to a set. 11 12 This has no effect if the element is already present. 13 """ 14 pass 15 16 def clear(self, *args, **kwargs): # real signature unknown 17 """ Remove all elements from this set. """ 18 pass 19 20 def copy(self, *args, **kwargs): # real signature unknown 21 """ Return a shallow copy of a set. """ 22 pass 23 24 def difference(self, *args, **kwargs): # real signature unknown 25 """ 26 相当于s1-s2 27 28 Return the difference of two or more sets as a new set. 29 30 (i.e. all elements that are in this set but not the others.) 31 """ 32 pass 33 34 def difference_update(self, *args, **kwargs): # real signature unknown 35 """ Remove all elements of another set from this set. """ 36 pass 37 38 def discard(self, *args, **kwargs): # real signature unknown 39 """ 40 与remove功能相同,删除元素不存在时不会抛出异常 41 42 Remove an element from a set if it is a member. 43 44 If the element is not a member, do nothing. 45 """ 46 pass 47 48 def intersection(self, *args, **kwargs): # real signature unknown 49 """ 50 相当于s1&s2 51 52 Return the intersection of two sets as a new set. 53 54 (i.e. all elements that are in both sets.) 55 """ 56 pass 57 58 def intersection_update(self, *args, **kwargs): # real signature unknown 59 """ Update a set with the intersection of itself and another. """ 60 pass 61 62 def isdisjoint(self, *args, **kwargs): # real signature unknown 63 """ Return True if two sets have a null intersection. """ 64 pass 65 66 def issubset(self, *args, **kwargs): # real signature unknown 67 """ 68 相当于s1<=s2 69 70 Report whether another set contains this set. """ 71 pass 72 73 def issuperset(self, *args, **kwargs): # real signature unknown 74 """ 75 相当于s1>=s2 76 77 Report whether this set contains another set. """ 78 pass 79 80 def pop(self, *args, **kwargs): # real signature unknown 81 """ 82 Remove and return an arbitrary set element. 83 Raises KeyError if the set is empty. 84 """ 85 pass 86 87 def remove(self, *args, **kwargs): # real signature unknown 88 """ 89 Remove an element from a set; it must be a member. 90 91 If the element is not a member, raise a KeyError. 92 """ 93 pass 94 95 def symmetric_difference(self, *args, **kwargs): # real signature unknown 96 """ 97 相当于s1^s2 98 99 Return the symmetric difference of two sets as a new set. 100 101 (i.e. all elements that are in exactly one of the sets.) 102 """ 103 pass 104 105 def symmetric_difference_update(self, *args, **kwargs): # real signature unknown 106 """ Update a set with the symmetric difference of itself and another. """ 107 pass 108 109 def union(self, *args, **kwargs): # real signature unknown 110 """ 111 相当于s1|s2 112 113 Return the union of sets as a new set. 114 115 (i.e. all elements that are in either set.) 116 """ 117 pass 118 119 def update(self, *args, **kwargs): # real signature unknown 120 """ Update a set with the union of itself and others. """ 121 pass
总结:本文介绍了元祖,字典,集合的定义、特性、常用操作以及各自的内置方法。