数据类型:
1.字符串
2.list
3.tuple
4.dict(dictionary)
1.字符串
每个字符也有下标从0开始。
>>> a = 'abcdefgh' >>> a 'abcdefgh' >>> a[0] 'a' >>> a[3] 'd' >>> a[3:] #从3下标开始到尾 'defgh' >>> a[:-1] #表示从到到尾,除了最后一个 'abcdefg' 步长:a[开始:结束:步长] >>> a[::3] 'adg'
错误例子:
>>> len(a) 8 >>> a[8] Traceback (most recent call last): File "<pyshell#84>", line 1, in <module> a[8] IndexError: string index out of range
注:长度为8,但下标是以0-7,a[8]超出该字符串最大下标
2.list
可以存储各种数据类型的数据,大杂缸。
下标的使用和切片操作: >>> a [1, '2', True, 4.1, [1, 2, 3]] >>> a[0] 1 >>> a[2] True >>> a[-1] [1, 2, 3] >>> a[-1][1] 2 >>> a[:-1] #-1表示最后一个列表元素,表示到最后一个元素前面停止 [1, '2', True, 4.1] 切片操作: >>> a[:] [10, 9, 3, 2, 2, 2, 1, 0] >>> a[2:] [3, 2, 2, 2, 1, 0] >>> a[:5] #前5个元素,索引0到4 [10, 9, 3, 2, 2] >>> a[::2] #列表也可有步长 [10, 3, 2, 1] 混合操作: >>> a[:2] = 'abcdef' >>> a ['a', 'b', 'c', 'd', 'e', 'f', 3, 4, 5] >>> a[:5] = [1,2] # a列表中0-4索引的元素替换成1,2 >>> a [1, 2, 'f', 3, 4, 5] >>> a[:3] = [1,2] >>> a [1, 2, 3, 4, 5] >>> a[::2] [1, 3, 5] #当用到切片+步长去重新赋值时候,长度要相等要一一对应 >>> a[::2] = [7,8] Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> a[::2] = [7,8] ValueError: attempt to assign sequence of size 2 to extended slice of size 3 >>> a[::2] = [7,8,9] >>> a [7, 2, 8, 4, 9]
列表第一个操作:增
总结:按位用insert,插最后用append,插入多个用extend
#insert按位插入,0表示第一位,len(a)表示最后一位(也可写个超大的数字,插入不会报错) >>> a.insert(0,'ze') >>> a ['ze', 1, '2', True, 4.1, [1, 2, 3]] >>> a.insert(len(a),'zhou') >>> a ['ze', 1, '2', True, 4.1, [1, 2, 3], 'zhou'] #append插入到最后一位 >>> a.append(11) >>> a ['ze', '1', '2', True, 4.1, [1, 2, 3], 'zhou', 10, 9, 8, 'sss', 11] #extend可以添加一个列表,列表里可包含多个参数,会拼接 >>> a.extend([10,9,8]) >>> a ['ze', '1', '2', True, 4.1, [1, 2, 3], 'zhou', 10, 9, 8] #也可以单独标出下标赋值 >>> a[1] = '1' >>> a ['ze', '1', '2', True, 4.1, [1, 2, 3], 'zhou'] >>> a[len(a)] = 'end' #len(a)-1 也可以到最后一位,直接len(a)会报错,下标超了 Traceback (most recent call last): File "<pyshell#99>", line 1, in <module> a[len(a)] = 'end' IndexError: list assignment index out of range
列表的第二个操作:删
总结:删尾用pop,删元素用remove,删除长的数据用del下标方式
#pop弹出最后一个元素,也从列表中移除,temp=a.pop()可以接到元素。 >>> a ['ze', '1', '2', True, 4.1, [1, 2, 3], 'zhou', 10, 9, 8, 'sss', 11] >>> a.pop() 11 >>> a ['ze', '1', '2', True, 4.1, [1, 2, 3], 'zhou', 10, 9, 8, 'sss'] >>> a.pop() 'sss'
>>> a
[1, 2, 3, 4, 5]
>>> a.pop(0) # 也可以指定索引删除元素
1
>>> a
[2, 3, 4, 5]
#remove指定删除某个元素,当删除某个不存在的元素抛出ValueError >>> a.remove('ze') >>> a ['1', '2', True, 4.1, [1, 2, 3], 'zhou', 10, 9, 8] >>> a.remove('test') Traceback (most recent call last): File "<pyshell#123>", line 1, in <module> a.remove('test') ValueError: list.remove(x): x not in list
注意:在列表中如果有相同的元素,用remove只会删除从左边找到的第一个
如果想要删除多个相同的元素:
1.for循环找到要删除元素的索引记录到一个临时列表
2.循环临时列表进行删除
# for循环列表不能更改该列表的长度,会影响到结果 #del删除 >>> del a[a.index('zhou')] #返回该元素索引,进行删除 >>> a ['1', '2', True, 4.1, [1, 2, 3], 10, 9, 8] >>> del a[2] # 直接以索引删除 >>> a ['1', '2', 4.1, [1, 2, 3], 10, 9, 8] #clear列表清空操作 >>> b = [1,2,3] >>> b [1, 2, 3] >>> b.clear() >>> b []
列表的第三个操作:改
总结:用index配合修改内容的情况应该多
#知其元素用index返回下标,修改内容
>>> a ['1', '2', 4.1, [1, 2, 3], 10, 9] >>> a[a.index('2')] = 2 # index的问题:从左边开始找到就返回,如果有多个相同的元素不行 >>> a ['1', 2, 4.1, [1, 2, 3], 10, 9]
#用下标修改内容
>>> a[0] = 1 >>> a [1, 2, 4.1, [1, 2, 3], 10, 9]
列表的第4个操作:查
#for循环遍历打印列表内容
>>> a [1, 2, 4.1, [1, 2, 3], 10, 9] >>> count = 0 >>> for i in a: print("%s : %s"%(count,i)) count += 1 0 : 1 1 : 2 2 : 4.1 3 : [1, 2, 3] 4 : 10 5 : 9
列表的其他操作:
总结:返回元素下标用index,count计重复元素个数,sort进行排序,reverse进行列表内容反转
#index返回元素下标 >>> a [1, 2, 4.1, [1, 2, 3], 10, 9] >>> a.index(4.1) 2 >>> a[2] 4.1 #count计该值在该列表重复的次数,如果该列表中没有该值返回0 >>> a [1, 2, 4.1, [1, 2, 3], 10, 9, 2, 2] >>> a.count(2) 3 >>> a.count(1) 1 >>> a.count('ab') 0 #sort排序(从小到大),从大到小一步搞定a.sort(reverse=True) >>> a [1, 2, 10, 9, 2, 2] >>> a.sort() >>> a [1, 2, 2, 2, 9, 10] >>> a [0, 10, 9, 3, 2, 2, 2, 1] >>> a.sort(reverse=True) >>> a [10, 9, 3, 2, 2, 2, 1, 0] #reverse反转列表(第一个到最后一个),不需要元素有什么顺序 >>> a.reverse() >>> a [10, 9, 2, 2, 2, 1]
列表拷贝需要注意的:
错误例子: >>> a [10, 9, 3, 2, 2, 2, 1, 0] >>> b = a >>> id(a) #a和b的内存地址相同 2658141685640 >>> id(b) 2658141685640 >>> a [10, 9, 3, 2, 2, 2, 1, 0] >>> b [10, 9, 3, 2, 2, 2, 1, 0] >>> a[0] = 11 >>> a [11, 9, 3, 2, 2, 2, 1, 0] >>> b [11, 9, 3, 2, 2, 2, 1, 0] #真正的拷贝,a[:] >>> b = a[:] >>> a [11, 9, 3, 2, 2, 2, 1, 0] >>> b [11, 9, 3, 2, 2, 2, 1, 0] >>> id(a) #a和b的内存地址不同 2658141685640 >>> id(b) 2658144536008 >>> a[0] = 10 >>> a [10, 9, 3, 2, 2, 2, 1, 0] >>> b [11, 9, 3, 2, 2, 2, 1, 0] >>> id(a) #列表元素修改后,列表地址不会变,列表元素地址会变 2658141685640
注:上面的只是浅copy,列表中如果还有可变数据类型元素还是会改变
可变数据类型:如列表,字典,集合
深copy:
子列表被修改示例: >>> a [1, 2, [3, 4]] >>> b = a[:] >>> b [1, 2, [3, 4]] >>> id(a),id(b) (2565562101576, 2565575577032) #最外层的列表内存地址表示已经独立 >>> a[2][1] = 5 >>> a,b ([1, 2, [3, 5]], [1, 2, [3, 5]]) >>> id(a[2]),id(b[2]) (2565575592584, 2565575592584) #子列表内存地址一样 #使用深copy: >>> import copy >>> b = copy.deepcopy(a) >>> id(a[2]),id(b[2]) (2565575592584, 2565575872072) >>> a,b ([1, 2, [3, 5]], [1, 2, [3, 5]]) >>> a[2][1] = 6 >>> a,b #a修改内容后,b的子列表没有被修改 ([1, 2, [3, 6]], [1, 2, [3, 5]])
3.tuple元祖(戴上枷锁的列表)
元祖中的元素不能进行修改,删除及插入操作。以(1,)形式。
#空元祖 >>> b = () >>> type (b) <class 'tuple'> #元祖只有count和index操作 >>> b = (1,2,3,4,5) >>> b (1, 2, 3, 4, 5) >>> b.count(1) #元祖值有几个重复的 1 >>> b.count(6) 0 >>> b.index(2) #返回元祖值的下标 1
4.dict字典(dictionary)
以key:value的形式存储数据,是无序的,需要通过key来获取value内容,如a['name']。
特点:1.无序 2.查找速度快 3.key必须唯一
字典第一个操作:增
总结:直接增加容易覆盖操作,可以先get(key)如果值为None,直接添加a[key] = value
#a[key] = value,直接添加 >>> a['name'] = 'zezhou' #当该key存在,则进行覆盖操作 >>> a {'name': 'zezhou'} #setdefault(key,value),字典有该key则返回该key的value,如果没有该key则新增key及value >>> a {'name': 'zezhou1'} >>> a.setdefault('name','zezhou') 'zezhou1' >>> a {'name': 'zezhou1'} >>> a.setdefault('age','18') '18' >>> a {'name': 'zezhou1', 'age': '18'}
字典第二个操作:删
总结:知其key删用pop(key),随机删除用popitem()
#pop(key)删除,会返回key下的value值 >>> a.pop('name') 'zezhou' >>> a.pop('zezhou') #当删除不存在的key,抛KeyError Traceback (most recent call last): File "<pyshell#32>", line 1, in <module> a.pop('zezhou') KeyError: 'zezhou' #popitem()删除,随机删除(数据少了看不出),感觉是删除最后一个 >>> a {'name': 'zezhou', 'name1': 'zezhou', 'name2': 'zezhou'} >>> a.popitem() #会返回key和value ('name2', 'zezhou') #del[key]删除 >>> b {'sex': '男'} >>> del b['sex'] >>> b {} #清空字典 a.clear()
字典第三个操作:改
总结:知其key直接修改,也应当判断该key是否存在get(key)为真,则修改a[key] = value
#直接修改,a[key] = value,覆盖修改 >>> a {'name': 'zezhou1', 'age': '18', 'sex': '男'} >>> a['age'] = 1 >>> a {'name': 'zezhou1', 'age': 1, 'sex': '男'} >>> a {'name': 'zezhou'} >>> a['ze'] # 不存在的key会报错 Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> a['ze'] KeyError: 'ze'
字典的第四个操作:查
总结:查用get(key)得其value,没查到可以用指定内容返回
>>> a {'name': 'zezhou1', 'age': 1, 'sex': '男'} #a[key]直接查该key的value >>> a['name'] 'zezhou1' #get(key),获取value值,如果没有这个key,不返回任何内容类型为NoneType或者为指定的内容 >>> a.get('name') 'zezhou1' >>> a.get('name',"该内容不存在!") 'zezhou1' >>> a.get('job',"该内容不存在!") '该内容不存在!' >>> temp = a.get('name1') >>> print(temp) None >>> type(temp) <class 'NoneType'>
字典的其他操作:
总结:拷贝字典用copy()切勿直接指向,清空字典用clear(),遍历创建key用fromkeys(key_list,default value),两个字典合并内容使用update(other_dictionary)
#只返回key,或只返回value >>> a {'name': 'zezhou1', 'age': '18'} >>> a.keys() dict_keys(['name', 'age']) >>> a.values() dict_values(['zezhou1', '18']) #update(other_dict)两个字典合并 >>> a {'name': 'zezhou1', 'age': '18'} >>> b = {'sex':'男'} >>> b {'sex': '男'} >>> a.update(b) >>> a {'name': 'zezhou1', 'age': '18', 'sex': '男'} 注:只是把字典b的内容更新到字典a,字典b还会存在 #fromkeys(key_list,value),批量创建key及添加默认值 >>> c = {} #需要先创建空字典 >>> c = c.fromkeys(['张三','李四','王五'],'test') #需要重新赋值 >>> c {'张三': 'test', '李四': 'test', '王五': 'test'} >>> c = c.fromkeys(['张三','李四','王五']) >>> c {'张三': None, '李四': None, '王五': None} #copy()拷贝字典 错误例子: #直接指向,会跟随改变 >>> d = c >>> d {'王五': None} >>> c {'王五': None} >>> id(d['王五']),id(c['王五']) (1588428080, 1588428080) >>> id(d),id(c) (2565575809712, 2565575809712) >>> c.popitem() ('王五', None) >>> c {} >>> d {} 用copy(): >>> b = c.copy() >>> id(b),id(c) (2565575859512, 2565575809712) >>> c.pop('张三') #c表删除,b表并不会改变 >>> b {'张三': None, '李四': None, '王五': None} >>> c {'李四': None, '王五': None} >>> id(b['李四']),id(c['李四']) (1588428080, 1588428080) >>> c.pop('李四') >>> b {'张三': None, '李四': None, '王五': None} >>> c {'王五': None}
注:字典没有深copy一说,因为字典的key是唯一的
字典的遍历操作:
for i in a.keys(): print("%s : %s "%(i,a[i])) name : zezhou1 age : 1 sex : 男
字典遍历删除:
注:需要将keys转成list类型
for i in list(a.keys()): # 循环的是产生的新的列表,去操作删除字典 a.pop(i)
注: 如果循环的是该字典,那就不可以在循环的时候有改变该字典大小的操作(如删除某个键值对)。