python-数据类型(str,list,tuple,dict)

数据类型:

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}
View Code

注:字典没有深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)

注: 如果循环的是该字典,那就不可以在循环的时候有改变该字典大小的操作(如删除某个键值对)。

转载于:https://www.cnblogs.com/zezhou/p/10460862.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值