【Python入门】5.Python中list、tuple、dict、set的用法

本节摘要:Python中list、tuple、dict、set的介绍与比较


Daily Record:每天一纪念,记录下python的学习历程,入门学习笔记与心得。本学习笔记主要基于廖雪峰大大的Python教程。不积跬步,无以至千里~ .゚(ง •̀_•́)ง


@[toc]


list   ()

list,是一种数据类型,即列表,清单的意思。list是一种有序的集合,可以随时添加和删除其中的元素。

  • list的创建与访问。
>>> S = ['a', 'b', 'c']                   #创建一个名字为S的list,在S中有字符a,b,c三个元素
>>> S
['a', 'b', 'c']
>>> S = [a, b]                            #错误,list包含的元素类型可以是字符串、整数、浮点数、布尔值、空值
>>> S = [1, 3.14]                         #可
>>> len(S)                                #获取list元素的个数
3
>>> S = ['a', 'b', 'c']
>>> S[0]                                  #访问S的第一个元素,索引是从0开始
'a'
>>> S[-1]                                 #访问S的倒数第一个即最后一个元素,即S[-1]=S[2]
'c'
>>> S[-2]                                 #访问S的倒数第二个元素,即S[-2]=S[1]
'b'
>>> S[-3]                                 #访问S的倒数第三个即第一个元素,即S[-3]=S[0]
'a'


  • list元素的添加与删除,有关.append( )、.insert( )、.pop( )的运用。

list是一个可变的有序表,所以,可以往list中追加元素到末尾:

>>> S.append('d')               #在集合S的末尾追加元素d
>>> S
['a', 'b', 'c', 'd']

也可以把元素插入到指定的位置,比如索引号为1的位置:

>>> S.insert(1, 'e')            #在索引号为1的位置插入元素
>>> S
['a', 'e', 'b', 'c', 'd']

要删除list末尾的元素,用pop()方法:

>>> S.pop()                     #删除集合S的最后一个元素
'd'
>>> S
['a', 'e', 'b', 'c']

要删除指定位置的元素,用pop(i)方法,其中i是索引位置:

>>> S.pop(1)                   #删除集合S索引号为1的元素
'e'
>>> S
['a', 'b', 'c']

要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:

>>> S[1] = 'f'
>>> S
['a', 'f', 'c']

list里面的元素的数据类型也可以不同,比如:

>>> S = ['Apple', 123, True]
>>> S
['Apple', 123, True]

list元素也可以是另一个list,比如:

>>> p = ['a', 'b', ['c', 'd'], 'e']
>>> len(p)
4

拆开写

>>> o = ['c', 'd']
>>> p = ['a', 'b', o, 'e']
>>> p
['a', 'b', ['c', 'd'], 'e']
>>> len(p)
4

要拿到'c'可以写o[0]或者p[2][0],因此p可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到。

>>> o = ['c', 'd']
>>> p = ['a', 'b', o, 'e']
>>> o[0]
'c'
>>> p[2][0]                               #访问list中的list元素
'c'

如果一个list中一个元素也没有,就是一个空的list,它的长度为0:

>>> D = []
>>> len(D)
0
>>> D = ()
>>> len(D)
0

tuple  []

一种有序列表,即元组,数组的意思。和list的区别是,tuple一旦创建好初始化就无法修改,可以访问获取其中元素,但不能添加append(),insert(),也不能删除元素。不能赋值成另外的元素。

tuple不可变的好处:代码更加安全。一般来说,能把list变成tuple最好。

  • tuple的创建与访问。
>>> S = ()                                  #定义一个空的tuple,通过x=()的形式定义
>>> S = ('a',)                              #定义只有一个元素的tuple,注意要有逗号,否则T将视为表示字符a的变量
>>> S = (1)     #定义只有1个元素的tuple时,这么写定义的不是tuple,是1这个数。
>>> S           #因为括号()既可以表示tuple,又可以表示数学公式中的小括号,产生了歧义
1               #Python规定,这种情况下,按小括号进行计算,计算结果是1
>>> S = (1,)    #定义只有1个元素的tuple时,加一个逗号,来消除歧义
>>> S
(1,)            #Python在显示只有1个元素的tuple时,也会加一个逗号,,以免被误解成数学计算意义上的括号
>>> S = ('a','b')                           #定义有两个元素的tuple
>>> S
('a', 'b')
>>> S = ('a','b',['c','d'])                 #定义内含list的tuple
>>> S [2][0]                                #tuple的访问与list访问一样
c
>>> S = (1, 3.14)                           #定义一个tuple
>>> S
(1, 3.14)
>>> S = ('a', 3.14)
>>> S
('a', 3.14)
>>> S = ()                                  #定义一个空的tuple
>>> S
()

“可变的”tuple:

>>> t = ('a', 'b', ['A', 'B'])   #此例子tuple定义后没变,变的是tuple里的list的元素
>>> t[2][0] = 'X'                #tuple的不变,是指向不变
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])           #要想让tuple内容不变,需让tuple中的每一个元素本身不变

总结:

list和tuple是Python内置的有序集合,list可变,tuple不可变。

【交作业】

Python 2.7

>>> L = [
    ['Apple', 'Google', 'Microsoft'],
    ['Java', 'Python', 'Ruby', 'PHP'],
    ['Adam', 'Bart', 'Lisa']
]
>>> print L[0][0]          # 打印Apple
Apple
>>> print L[1][1]          # 打印Python
Python
>>> print L[2][2]          # 打印Lisa
Lisa

Python 3.x

>>> L = [
    ['Apple', 'Google', 'Microsoft'],
    ['Java', 'Python', 'Ruby', 'PHP'],
    ['Adam', 'Bart', 'Lisa']
]
>>> print (L[0][0])          # 打印Apple
Apple
>>> print (L[1][1])          # 打印Python
Python
>>> print (L[2][2])          # 打印Lisa
Lisa

dict  {}

dict,即dictionary,字典的意思。使用键—数值(key-value)的方式储存,具有很快的查询速度。需要注意的是,dict的key一定要是不可变对象,如字符串,整数,而list是可变对象不能用作key。

  • dict的创建与访问。

把数据放入dict的方法:第一初始化时指定;

>>> D = {'Lareina': 100, 'Michael': 99}  #初始化时指定定义好dict中的数据
>>> D
{'Michael': 99, 'Lareina': 100}          #Python3.6后的dict有序,3.6之前的dict无序
>>> D['Lucy'] = 60
>>> D
{'Michael': 99, 'Lucy': 60, 'Lareina': 100} 
>>> D['Lucy'] = 8
>>> D
{'Michael': 99, 'Lucy': 8, 'Lareina': 100} 
>>> D = {'Lareina': 100, 'Michael': 99, 66:'aaa'}        #定义一个dict
>>> D['Michael']                                         #访问D中key为'Michael'的值99
>>> 99
>>> D['66'] = 'bbb'       #注意区分D[‘66’]与D[66],D[‘66’]是新增了一个key
>>> D
{'Lareina': 100, 'Michael': 99, 66:'aaa', '66':'bbb'}
>>> D[66] = 'ccc'                                        #key对应的值可以被修改
>>> D
{'Lareina': 100, 'Michael': 99, 66:'ccc', '66':'bbb'}
>>> D[66]
'ccc'

把数据放入dict的方法:第二通过key放入。

>>> D['Lucy'] = 60                       #通过key把数据放入dict
>>> D
['Lucy'] = 60

因为,一个key只能对应一个value,so,多次对一个key放入value时,后面的值会把前面的值冲掉:

>>> D['Lucy'] = 60                       
>>> D
['Lucy'] = 60
>>> D['Lucy'] = 8             #当第二次把'Lucy'定义成8,把之前的值60冲掉了          
>>> D
['Lucy'] = 8

注意:dict内部存放的顺序和key放入的顺序是没有关系的。

  • dict的key判断与修改,有关.get( )、 .pop( )的运用。

如果key不存在,dict会报错:

在这里插入图片描述
>>> D['Mike']                 #若key不存在,dict会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Mike'

避免出现key不存在错误的两种方法:

方法一,通过in判断key是否存在

>>> 'Mike' in D                   #判断D中是否有'Mike'这一key
False
>>> 'Lareina' in D
>>> True

方法二,通过dict提供的get方法,如果key不存在,可以返回None(返回None的时候Python的交互式命令行不显示结果),或者自己指定的value:

>>> D.get('Lareina')              #拿取D中'Lareina'对应的数值
>>> 100
>>> D.get('Mike')                 ##若没有指定的key,key不存在,则返回None,Python中不显示结果
>>> D.get('Mike', -8)             #若没有指定的key,key不存在,返则回制定值value
-8

删除一个key,用pop(key)方法,对应的value也会从dict中删除:

>>> D
{'Michael': 99, 'Lareina': 100}
>>> D.pop('Michael')           #用pop(key)的方式来删除key,同时对应的值也会被删除
99
>>> D
{'Lareina': 100}

 

list 与 dict 区别

查找和插入的速度 占用空间 浪费内存
list 慢,随元素的增加而增加
dict 极快,不会随key增加而变慢

dict 其实就是以空间换时间,可以用在需要快速查找的地方。


注意: dict的key必须是不可变对象

原因:dict 是根据key来计算value的储存位置,如果给出相同的key计算的value结果不同,那dict 内部就会混乱。
这种根据key计算位置的算法成为==哈希算法(Hash)==。

为了保证hash的正确性,key的对象不能变。key可以选择不能变的字符串、整数等。不能选择可以变化的list。

>>> D = {'Lareina': 100, 'Michael': 99}
>>> key = [1, 2, 3]
>>> D[key] = 'a list'                          #list不能作为key,会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

set

set,即一套,集合的意思。在Python中与dict类似,但只有key,没有value。在set中不会有重复的key。同样的,set中的key一定要是不可变对象。

  • set的创建、添加与删除。
>>> s = set([2, 4, 6, 8])      #创建一个set,值得注意的是,set是无序和无重复元素的集合
>>> s                          #传入的参数[1, 2, 3]是一个list
set([8, 2, 4, 6])              #表示set内部有1,2,3这3个元素,但此处的[]不是list
>>> s = {1, 2, 3}              #或者直接通过{}创建
>>> s
set([1, 2, 3])                 #Python2.7.x显示
{1, 2, 3}                      #Python3.x显示
>>> s = set([2, 2, 4, 4, 6, 6, 8, 8])    #重复元素在set中自动被过滤
>>> s
set([8, 2, 4, 6])
>>> s.add(10)                  #add(key)方式添加元素
>>> s
set([8, 2, 4, 10, 6])
>>> s.add(10)                  #重复添加元素不会有变化
>>> s
set([8, 2, 4, 10, 6])
>>> s.remove(10)               #remove()方式删除元素
>>> s
set([8, 2, 4, 6])
  • set的集合运算。
>>> s1 = set([1, 3, 5])
>>> s2 = set([3, 5, 7])
>>> s1 | s2                            #并集
set([1, 3, 5, 7])
>>> s1 & s2                            #交集
set([3, 5])

set 与 dict 区别

| | 储存key对应的value |
|--|--|--|--|
| set | 无 |
| dict | 有 |

相似:set 和 dict 都不能放入可变对象

set中不能放入list,会报错

>>> set([[1, 2], 3)
  File "<stdin>", line 1
    set([[1, 2], 3)
                  ^
SyntaxError: invalid syntax
>>> s
set([1, 2, 3])
>>> s.add([1, 2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

可变对象与不可变对象

  • 可变对象

例如list是可变对象,对于list操作,list内部内容会变化

>>> a = ['c', 'b', 'd']  
>>> a.sort()                              #sort()排序函数默认升序
>>> a
['b', 'c', 'd']
  • 不可变对象
    str是不变对象
>>> a = '345'
>>> a.replace('3', '7')
'745'                       #创建了新的字符串'745'
>>> a
'345'

字符串虽然有replace(),但其实是创建了新的字符串,让新变量指向了新的字符串而已,原来的变量指向的字符串并没有改变,即不可变对象本身永远是不可变的。


list、tuple、dict、set的比较

定义 添加元素 删除元素
list z = [ , , ] 末尾追加元素z.append()

指定位置插入元素z.insert(索引号, 元素)
删除末尾元素z.pop()

删除指定位置元素z.pop(索引号)
tuple z = ( , , )
dict z = {key1: value1, key2: value2} z[keyi]=valuei z.pop(key1)
set z=set([ , , ])或z={ , , } z.add(keyi) z.remove(keyi)

 /) /)
ฅ(• - •)ฅ ~ ~ ฅ’ω’ฅ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345