2020-05-03 python中列表、元组、字典、集合的异同

转载地址    http://blog.csdn.net/weixin_37720172/article/details/78769301

一.前言

一直想写写这四种类型的相同点,与不同点在哪里,以及在什么情况下应该使用哪种类型。无奈水平不够,怕写出来不够深刻,所以一直拖着。今天想了想还是写出来吧,如果以后还有新的见解或者技巧我会继续更上去的。

二.列表(list)

具有以下特点:

1.可以用list()函数或者方括号[]创建,元素之间用逗号’,‘’分隔。

2.列表的元素不需要具有相同的类型

3.使用索引来访问元素

4.可切片

# 可用list()函数建立

list1 =list((1,2))

# 用[]建立,可包含不同数据类型

list2 = [1,3,'hello',3.5]

# 可用下标访问

print(list1[1])

# 切片

print(list2[1:3])

1

1

2

3

4

5

6

7

8

结果:

2

[3,'hello']

1

1

2

方法:

操作解释

list.append():追加成员

list.count(x):计算列表中参数x出现的次数

list.extend(L):向列表中追加另一个列表L

list.index(x):获得参数x在列表中的位置

list.insert():向列表中插入数据

list.pop():删除列表中的成员(通过下标删除)

list.remove():删除列表中的成员(直接删除)

list.reverse():将列表中成员的顺序颠倒

list.sort():将列表中成员排序

三.元组

元组跟列表很像,只不过元组用小括号来实现(),这里要区分好和生成器的区别,两者都可用小括号来实现的

具有以下特点:

1.可以用tuple()函数或者方括号()创建,元素之间用逗号’,‘’分隔。

2.元组的元素不需要具有相同的类型

3.使用索引来访问元素

4.可切片

5.元素的值一旦创建就不可修改!!!!!(这是区别与列表的一个特征)

# 可用tuple()函数创建

tuple1 = tuple([1,2])

# 用()建立,可包含不同数据类型

tuple2 = (1,3,'hello',3.5)

# 可用下标访问

print(tuple1[1])

# 可切片

print(tuple2[1:3])

# 不可以修改元素

tuple1[1] =10

1

1

2

3

4

5

6

7

8

9

10

结果:

2

(3,'hello')

TypeError:'tuple'objectdoesnotsupportitemassignment

1

1

2

3

可进行的操作:元组由于它的不可变性(第五点特点),相比列表的操作少了很多,只保留了index(),count()函数,用法同列表。

当然也可以用内置函数来对他进行操作,这些内置函数对于列表也适用。

操作解释

cmp(tuple1, tuple2)比较两个元组元素。

len(tuple)计算元组元素个数。

max(tuple)返回元组中元素最大值。

min(tuple)返回元组中元素最小值。

tuple(seq)将列表转换为元组。

上面第五点在列表中的操作为(参考上面示例代码的第一点):

操作解释

list(seq)将元组转换为列表。

四.字典(Dictionary)

字典是另一种可变容器模型,且可存储任意类型对象。

具有以下特点:

1.元素由键(key)和值(value)组成

2.可以用dict()函数或者方括号()创建,元素之间用逗号’,‘’分隔,键与值之间用冒号”:”隔开

3.键必须是唯一的,但值则不必。值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组

4.使用键(key)来访问元素

# 用dict()函数创建

dict1 = dict([('name','kyda'), ('e',10)])

# 用{}创建

dict2 = {'name':'lin','age':21}

print(dict1)

# 使用键(key)来访问元素

print(dict2['name'])

# 使用键(key)来访问元素,并修改元素的值

dict2['age'] =23

print(dict2)

1

1

2

3

4

5

6

7

8

9

10

结果:

(3,'hello')

{'name':'kyda','age':10}

lin

{'name':'lin','age':23}

1

1

2

3

4

字典的方法:

操作解释

adict.keys()返回一个包含字典所有KEY的列表;

adict.values()返回一个包含字典所有value的列表;

adict.items()返回一个包含所有(键,值)元祖的列表;

adict.clear()删除字典中的所有项或元素;

adict.copy()返回一个字典浅拷贝的副本;

adict.fromkeys(seq, val=None)创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(默认为None);

adict.get(key, default = None)返回字典中key对应的值,若key不存在字典中,则返回default的值(default默认为None);

adict.has_key(key)如果key在字典中,返回True,否则返回False。 现在用 in 、 not in;

adict.iteritems() adict.iterkeys() adict.itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表;

adict.pop(key[,default])和get方法相似。如果字典中存在key,删除并返回key对应的vuale;如果key不存在,且没有给出default的值,则引发keyerror异常;

adict.setdefault(key, default=None)和set()方法相似,但如果字典中不存在Key键,由 adict[key] = default 为它赋值;

adict.update(bdict)将字典bdict的键值对添加到字典adict中。

五.集合(set)

具有以下特点:

1.可以用set()函数或者方括号{}创建,元素之间用逗号”,”分隔。

2.与字典相比少了键

3.不可索引,不可切片

4.不可以有重复元素

# 两种方法创建

set1 =set('kydaa')

set2 = {'abc','jaja','abc','kyda'}

print(set1)

print(set2)

1

1

2

3

4

5

结果:自动将重复元素去除

{'a','y','d','k'}

{'jaja','abc','kyda'}

1

1

2

集合的方法:

操作解释

s.issubset(t),s <= t测试是否 s 中的每一个元素都在 t 中

s.issuperset(t),s >= t测试是否 t 中的每一个元素都在 s 中

s.union(t),s | t返回一个新的 set 包含 s 和 t 中的每一个元素

s.intersection(t),s & t返回一个新的 set 包含 s 和 t 中的公共元素

s.difference(t),s - t返回一个新的 set 包含 s 中有但是 t 中没有的元素

s.symmetric_difference(t),s ^ t返回一个新的 set 包含 s 和 t 中不重复的元素

s.copy()返回 set “s”的一个浅复制

六.同异

1.列表和元组

列表和元组有很多相似的地方,操作也差不多。不过列表是可变序列,元组为不可变序列。也就是说列表主要用于对象长度不可知的情况下,而元组用于对象长度已知的情况下,而且元组元素一旦创建变就不可修改。

例如我们在打开一个文本时,并不知道里面有多少行文字,所以用列表来保存。

withopen('test.txt','r')asf:

    print(f.readlines())

# 结果:

# ['hello world\n', 'hi kyda\n', 'this is my program']

1

1

2

3

4

而我们在储存一个人的信息(名字,年龄,性别,假定只需要这三种信息,所以对象长度为3)的时候,就可以用元组来实现。

id = ('kyda',19,'man')

print(id)

# 结果:

# ('kyda', 19, 'man')

1

1

2

3

4

2.字典

字典主要应用于需要对元素进行标记的对象,这样在使用的时候便不必记住元素列表中或者元组中的位置,只需要利用键来进行访问对象中相应的值。

id = {'name':'kyda','age':19, ‘sex': 'man')

print(id['age'])

# 结果:

# 19

1

1

2

3

4

3.集合

集合中的元素不可重复的特点使它被拿来去重。比如我在爬去糗事百科全站的文章链接(存放与列表中)的时候,不可避免的会遇到重复的链接。这是我们只需将列表转换为集合便能有效的去除重复部分。

比如上面的例程。

4.在海量数据中查找元素时,最好将数据创建为字典,或者是集合

这是由于字典和集合背后的查找原理是散列(哈希)表。由于散列表在查找元素时的时间复杂度基本是O(1),这使查找时间很短。

在我的一篇博客专门实验了列表,元组,字典,集合在查找元素时所用的时间:

Python进阶(八):in的详解

5.灵活运用推导来创建

推导可以说是python最灵活的特性之一。

例子:

list1 = [xforxinrange(1,10)]

1

1

元组和集合都可以用上面的推导方式进行简单创建

对于字典来说我们也可以运用双重推导(笛卡尔积)来创建:

list1 = ['name','age','sex']

list2 = ['kyda',19,'man']

ID = {x: yforxinlist1foryinlist2}

print(ID)

# 结果

# {'name':'man','age':'man','sex':'man'}

1

1

2

3

4

5

6

7

当然上面还可以运用zip()函数简化为:

ID = {x: yforx, yinzip(list1, list2)}

1

1

列表和元组也可以运用双重推导(笛卡尔积)来创建。比如我们要生成一个二维坐标数组:

coordinate = [(x, y)forxinrange(2)

foryinrange(2)]

print(coordinate)

# 结果

# [(0, 0), (0, 1), (1, 0), (1, 1)]

1

1

2

3

4

5

6.枚举元素

对于列表, 集合,集合都可以运用for…in…来进行枚举

set1 = {'name','age','sex'}

fortmpinset1:

    print(tmp)

# 结果

# name

# age

# sex

1

1

2

3

4

5

6

7

8

9

有时候,我们需要用到元素的索引:

index=0

fortmp in set1:

print(tmp,index)

index+=1

1

1

2

3

4

这样写太过于冗余,我可以用enumerate()函数来帮组我们实现:

forindex, tmp in enumerate(set1):

print(tmp,index)

1

1

2

效果是一样的,可这样看起来更加简洁了

而对于字典,我们要枚举时就有点麻烦。不过还好,字典的方法中有三个方法帮助我们解决这个问题:

操作解释

adict.keys()返回一个包含字典所有KEY的列表;

adict.values()返回一个包含字典所有value的列表;

adict.items()返回一个包含所有(键,值)元祖的列表;

示例:

list1 = ['name','age','sex']

list2 = ['kyda',19,'man']

ID = {x: yforx, yinzip(list1, list2)}

fortmpinID.items():

print(tmp)

# 结果:

# ('age', 19)

# ('sex', 'man')

# ('name', 'kyda')

1

转载地址    http://blog.csdn.net/weixin_37720172/article/details/78769301

一.前言

一直想写写这四种类型的相同点,与不同点在哪里,以及在什么情况下应该使用哪种类型。无奈水平不够,怕写出来不够深刻,所以一直拖着。今天想了想还是写出来吧,如果以后还有新的见解或者技巧我会继续更上去的。

二.列表(list)

具有以下特点:

1.可以用list()函数或者方括号[]创建,元素之间用逗号’,‘’分隔。

2.列表的元素不需要具有相同的类型

3.使用索引来访问元素

4.可切片

# 可用list()函数建立

list1 =list((1,2))

# 用[]建立,可包含不同数据类型

list2 = [1,3,'hello',3.5]

# 可用下标访问

print(list1[1])

# 切片

print(list2[1:3])

1

1

2

3

4

5

6

7

8

结果:

2

[3,'hello']

1

1

2

方法:

操作解释

list.append():追加成员

list.count(x):计算列表中参数x出现的次数

list.extend(L):向列表中追加另一个列表L

list.index(x):获得参数x在列表中的位置

list.insert():向列表中插入数据

list.pop():删除列表中的成员(通过下标删除)

list.remove():删除列表中的成员(直接删除)

list.reverse():将列表中成员的顺序颠倒

list.sort():将列表中成员排序

三.元组

元组跟列表很像,只不过元组用小括号来实现(),这里要区分好和生成器的区别,两者都可用小括号来实现的

具有以下特点:

1.可以用tuple()函数或者方括号()创建,元素之间用逗号’,‘’分隔。

2.元组的元素不需要具有相同的类型

3.使用索引来访问元素

4.可切片

5.元素的值一旦创建就不可修改!!!!!(这是区别与列表的一个特征)

# 可用tuple()函数创建

tuple1 = tuple([1,2])

# 用()建立,可包含不同数据类型

tuple2 = (1,3,'hello',3.5)

# 可用下标访问

print(tuple1[1])

# 可切片

print(tuple2[1:3])

# 不可以修改元素

tuple1[1] =10

1

1

2

3

4

5

6

7

8

9

10

结果:

2

(3,'hello')

TypeError:'tuple'objectdoesnotsupportitemassignment

1

1

2

3

可进行的操作:元组由于它的不可变性(第五点特点),相比列表的操作少了很多,只保留了index(),count()函数,用法同列表。

当然也可以用内置函数来对他进行操作,这些内置函数对于列表也适用。

操作解释

cmp(tuple1, tuple2)比较两个元组元素。

len(tuple)计算元组元素个数。

max(tuple)返回元组中元素最大值。

min(tuple)返回元组中元素最小值。

tuple(seq)将列表转换为元组。

上面第五点在列表中的操作为(参考上面示例代码的第一点):

操作解释

list(seq)将元组转换为列表。

四.字典(Dictionary)

字典是另一种可变容器模型,且可存储任意类型对象。

具有以下特点:

1.元素由键(key)和值(value)组成

2.可以用dict()函数或者方括号()创建,元素之间用逗号’,‘’分隔,键与值之间用冒号”:”隔开

3.键必须是唯一的,但值则不必。值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组

4.使用键(key)来访问元素

# 用dict()函数创建

dict1 = dict([('name','kyda'), ('e',10)])

# 用{}创建

dict2 = {'name':'lin','age':21}

print(dict1)

# 使用键(key)来访问元素

print(dict2['name'])

# 使用键(key)来访问元素,并修改元素的值

dict2['age'] =23

print(dict2)

1

1

2

3

4

5

6

7

8

9

10

结果:

(3,'hello')

{'name':'kyda','age':10}

lin

{'name':'lin','age':23}

1

1

2

3

4

字典的方法:

操作解释

adict.keys()返回一个包含字典所有KEY的列表;

adict.values()返回一个包含字典所有value的列表;

adict.items()返回一个包含所有(键,值)元祖的列表;

adict.clear()删除字典中的所有项或元素;

adict.copy()返回一个字典浅拷贝的副本;

adict.fromkeys(seq, val=None)创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(默认为None);

adict.get(key, default = None)返回字典中key对应的值,若key不存在字典中,则返回default的值(default默认为None);

adict.has_key(key)如果key在字典中,返回True,否则返回False。 现在用 in 、 not in;

adict.iteritems() adict.iterkeys() adict.itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表;

adict.pop(key[,default])和get方法相似。如果字典中存在key,删除并返回key对应的vuale;如果key不存在,且没有给出default的值,则引发keyerror异常;

adict.setdefault(key, default=None)和set()方法相似,但如果字典中不存在Key键,由 adict[key] = default 为它赋值;

adict.update(bdict)将字典bdict的键值对添加到字典adict中。

五.集合(set)

具有以下特点:

1.可以用set()函数或者方括号{}创建,元素之间用逗号”,”分隔。

2.与字典相比少了键

3.不可索引,不可切片

4.不可以有重复元素

# 两种方法创建

set1 =set('kydaa')

set2 = {'abc','jaja','abc','kyda'}

print(set1)

print(set2)

1

1

2

3

4

5

结果:自动将重复元素去除

{'a','y','d','k'}

{'jaja','abc','kyda'}

1

1

2

集合的方法:

操作解释

s.issubset(t),s <= t测试是否 s 中的每一个元素都在 t 中

s.issuperset(t),s >= t测试是否 t 中的每一个元素都在 s 中

s.union(t),s | t返回一个新的 set 包含 s 和 t 中的每一个元素

s.intersection(t),s & t返回一个新的 set 包含 s 和 t 中的公共元素

s.difference(t),s - t返回一个新的 set 包含 s 中有但是 t 中没有的元素

s.symmetric_difference(t),s ^ t返回一个新的 set 包含 s 和 t 中不重复的元素

s.copy()返回 set “s”的一个浅复制

六.同异

1.列表和元组

列表和元组有很多相似的地方,操作也差不多。不过列表是可变序列,元组为不可变序列。也就是说列表主要用于对象长度不可知的情况下,而元组用于对象长度已知的情况下,而且元组元素一旦创建变就不可修改。

例如我们在打开一个文本时,并不知道里面有多少行文字,所以用列表来保存。

withopen('test.txt','r')asf:

    print(f.readlines())

# 结果:

# ['hello world\n', 'hi kyda\n', 'this is my program']

1

1

2

3

4

而我们在储存一个人的信息(名字,年龄,性别,假定只需要这三种信息,所以对象长度为3)的时候,就可以用元组来实现。

id = ('kyda',19,'man')

print(id)

# 结果:

# ('kyda', 19, 'man')

1

1

2

3

4

2.字典

字典主要应用于需要对元素进行标记的对象,这样在使用的时候便不必记住元素列表中或者元组中的位置,只需要利用键来进行访问对象中相应的值。

id = {'name':'kyda','age':19, ‘sex': 'man')

print(id['age'])

# 结果:

# 19

1

1

2

3

4

3.集合

集合中的元素不可重复的特点使它被拿来去重。比如我在爬去糗事百科全站的文章链接(存放与列表中)的时候,不可避免的会遇到重复的链接。这是我们只需将列表转换为集合便能有效的去除重复部分。

比如上面的例程。

4.在海量数据中查找元素时,最好将数据创建为字典,或者是集合

这是由于字典和集合背后的查找原理是散列(哈希)表。由于散列表在查找元素时的时间复杂度基本是O(1),这使查找时间很短。

在我的一篇博客专门实验了列表,元组,字典,集合在查找元素时所用的时间:

Python进阶(八):in的详解

5.灵活运用推导来创建

推导可以说是python最灵活的特性之一。

例子:

list1 = [xforxinrange(1,10)]

1

1

元组和集合都可以用上面的推导方式进行简单创建

对于字典来说我们也可以运用双重推导(笛卡尔积)来创建:

list1 = ['name','age','sex']

list2 = ['kyda',19,'man']

ID = {x: yforxinlist1foryinlist2}

print(ID)

# 结果

# {'name':'man','age':'man','sex':'man'}

1

1

2

3

4

5

6

7

当然上面还可以运用zip()函数简化为:

ID = {x: yforx, yinzip(list1, list2)}

1

1

列表和元组也可以运用双重推导(笛卡尔积)来创建。比如我们要生成一个二维坐标数组:

coordinate = [(x, y)forxinrange(2)

foryinrange(2)]

print(coordinate)

# 结果

# [(0, 0), (0, 1), (1, 0), (1, 1)]

1

1

2

3

4

5

6.枚举元素

对于列表, 集合,集合都可以运用for…in…来进行枚举

set1 = {'name','age','sex'}

fortmpinset1:

    print(tmp)

# 结果

# name

# age

# sex

1

1

2

3

4

5

6

7

8

9

有时候,我们需要用到元素的索引:

index=0

fortmp in set1:

print(tmp,index)

index+=1

1

1

2

3

4

这样写太过于冗余,我可以用enumerate()函数来帮组我们实现:

forindex, tmp in enumerate(set1):

print(tmp,index)

1

1

2

效果是一样的,可这样看起来更加简洁了

而对于字典,我们要枚举时就有点麻烦。不过还好,字典的方法中有三个方法帮助我们解决这个问题:

操作解释

adict.keys()返回一个包含字典所有KEY的列表;

adict.values()返回一个包含字典所有value的列表;

adict.items()返回一个包含所有(键,值)元祖的列表;

示例:

list1 = ['name','age','sex']

list2 = ['kyda',19,'man']

ID = {x: yforx, yinzip(list1, list2)}

fortmpinID.items():

print(tmp)

# 结果:

# ('age', 19)

# ('sex', 'man')

# ('name', 'kyda')

1

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