栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python自主学习——Python基本数据结构(列表、集合、元组)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python自主学习——Python基本数据结构(列表、集合、元组)

Python基本数据结构 列表

列表是Python中7个序列的内置类型(列表,元组,range,str,bytes,bytearray,memoryview)的一种
列表是最常用的Python数据类型,非常适合利用顺序和位置定位某一元素,而且其元素不需要类型相同。列表是可变的,可以直接对原始列表进行修改:添加、删除、覆盖元素。列表中具有相同值的元素允许出现多次。

创建列表

只要把逗号分隔的不同的数据项使用方括号()括起来即可。或者使用内置的函数。[]、list()
与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。

将其他数据类型转换成列表
list('abc')  
# ['a','b','c']
a_tuple = ('a','b','c')
list(a_tuple)
#  ['a','b','c']
索引切片

与字符串索引切片类似

列表嵌套

列表可以包括各种类型的元素,包括列表:

lower_alphas = list('abcdefg')
upper_alphas = list('abcdefg'.upper())
alphas = [lower_alphas, upper_alphas]
alphas
# [['a', 'b', 'c', 'd', 'e', 'f', 'g'], ['A', 'B', 'C', 'D', 'E', 'F', 'G']]
添加元素

使用函数在列表末尾添加元素;append()

alist = [1, 2, 3]
alist.append(4)
alist
#[1,2,3,4]

使用函数函数在指定的元素,第一个参数要指定要插入的位置(偏移量),第二个参数指定要插入的元素。如果指定偏移量超过了列表的尾部,则插入到列表最后。insert()

alist = [1, 2, 3]
alist.insert(0, 0)
alist.insert(10, 10)
alist
#[0, 1, 2, 3, 10]
修改元素

通过索引(偏移量)访问某列元素,并可以通过赋值操作对其进行修改:

alist = [1, 2, 3]
alist[0] = 'modified'
alist[1:4] = 'a', 'b', 'c'
alist
# ['modified', 'a', 'b', 'c']
删除元素:

使用删除指定位置的元素,当列表中的元素被删除后,位于其后面的元素自动迁移补填空位,且长度减去删除元素个数 del

删除指定值元素

remove()

blist = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
blist.remove('b')
blist
#['a', 'c', 'd', 'e', 'f', 'g']

####获取并删除指定位置的元素

使用可以获取列表中指定位置的元素,并将此元素从列表中删除。如果未,则未指定参数,则默认返回列表末尾的元素,使用将返回列表头部的元素。当列表为空或索引超出范围时,将触发异常 pop()

清空列表元素

使用函数清空列表中所以有元素:clear()

合并列表

使用函数或操作并列表:extend()或 +=

clist = ['a', 'b', 'c']
dlist = ['d']
elist = ['e', 'f']
clist.extend(elist)
#clist = clist + elist  # 创建了一个新对象
#clist += elist  # 修改原来的clist对象
clist
# ['a', 'b', 'c', 'e', 'f']
查询具有特定指的元素的位置

使用index()函数查询具有特定值的元素在列表中的位置(偏移量):

成员关系判断

使用in判断元素是否包含于某个列表

'e' in clist   # True
'h' not in clist  # True
记录特定值出现的次数

使用count()记录特定值在列表中出现的次数

clist.count('a')
列表的元素排列
  • 使用列表对象方法sort()队员列表进行排序,改变源列表进行排序,改变原列表内容
  • 使用通用函数sorted()返回排好序的列表副本,原列表内容不变

如果列表当中的元素是数字,默认排序方式是从小到大的升序。如果元素都是字符串,则按照字母顺序排序。默认的排序都是升序的,通过添加参数reverse=True可以改为降序排列

numbers = [2, 1, 4.0, 3]
numbers.sort(reverse=True)
sorted_numbers = sorted(numbers)  #通过复制的方式生成副本
print(numbers)
print(sorted_numbers)

#[4.0, 3, 2, 1]
#[1, 2, 3, 4.0]
复制列表

通过下面三种方法,将一个列表复制到另外一个新列表中:

  • 列表copy()函数
  • list()转换函数
  • 列表切片[:]
a = [1,2,3]
b.copy(a)
c = list(a)
d = a[:]
print('a: ', a, 'nb: ', b, 'nc: ', c, 'nd: ', d)
# 列表复制  复制的是引用,对于不可变类型他复制的就是值,对于可变类型(列表的嵌套),他复制的就是引用
#a:  [1, 2, 3] 
#b:  [1, 2, 3] 
#c:  [1, 2, 3] 
#d:  [1, 2, 3]
import copy
a=[1,2,3,[4,5]]
b = a.copy()
c = list(a)
d=a[:]
e=copy.deepcopy(a)
#a:  [1, 2, 3, [4, 5]] 
#b:  [1, 2, 3, [4, 5]] 
#c:  [1, 2, 3, [4, 5]] 
#d:  [1, 2, 3, [4, 5]] 
#d [1, 2, 3, [4, 5]]
元组

元组与列表有很多地相似之处,但他是一种不可变容器。元组一旦被定义后,便不可更改。它能够用来做一些列表不能做地事,如用作一个字典地键。鉴于其他列表很大程度上是相似的,所以这里着重描述元组和列表地不同之处

1. 创建元素

列表用[]或者list()、元组用()或tuple()

创建一个或多个元素地元组时,每一个元素后面都需要跟着一个逗号,即使只包含一个元素也不能省略。如果创建元组所包含地元组所包含地元素数量超过1,最后一个元素后面地逗号可以省略

2. 元组解包

将元组赋值给多个变量,这个过程就是元组解包

atuple = ('mon', 'tue', 'wed')
btuple = ('mon', 'tue', 'wed')

这里需要地变量地数量必须跟元组元素地数量是一样的,如果个数不匹配就会产生异常

实际上,这种解包赋值可以用在任何可迭代的对象上面,包括元组、列表、字符串、文本对象、迭代器和生成器
使用tuple()构造器可将其他可迭代类型对象转换成元组:

tuple()   # 空元组
tuple(range(5))   # (0, 1, 2, 3, 4)
tuple('abcdefg')  # ('a', 'b', 'c', 'd', 'e', 'f', 'g')

元组是不可以更新的但是如果元组的某个成员是列表,那么这个成员是可以更改的

字典

字典是python中唯一的“映射”类型。一个函数f将键(key,定义域)映射到值(value,值域)。

1.创建和赋值

使用{}创建字典。使用dict()构造器可从其他对象创建字典

empty_dict = {}
dict2 = {'name':'earth','port':80}
# {'name': 'earth', 'port': 80}
dict3 = dict((['x':1,['y':2]]))
# {'x': 1, 'y': 2}
dict4 = dict(['ab','cd','ef'])
# {'a': 'b', 'c': 'd', 'e': 'f'}
dict5 = dict(one=1,two=2)
#{'one': 1, 'two': 2}
dict6 = dict(zip(['one','two'],[1,2]))
# {'one': 1, 'two': 2}
dict7 = {}.fromkeys(('x','y'),-1)
# {'x': -1, 'y': -1}
dict8 = {}.fromkeys(('x','y'))
# {'x': None, 'y': None}

fromkeys()可以使用一个可迭代的序列作为键集合创建一个默认字典,第二个参数是默认值,如果忽略的话默认值为None

2.获取元素

使用键来获取元素

dict1 = {'name': 'earth', 'port': 80}
dict1['name']
#'earth'

如果试图访问的键在字典中不存在,则会引发一个异常

3.修改元素
dict1['name'] = 'moon'
dict1['port'] = 777
dict1['age'] = 20       # 添加新元素
dict2 = {'name': 'mars', 'port': 888}
dict1.update(dict2)  # update a dict with another
dict1

 # {'name': 'mars', 'port': 888, 'age': 20}
4.合并字典
  1. 最简单的原地更新,即使用update方法,用于把另外一个字典更新到子集上

    profile = {'name':'xiaoming','age':27}
    ext_info = {'gender':'male'}
    profile.update(ext_info)
    print(profile)
    # {‘name’: ‘xiaoming’, ‘age’: 27, ‘gender’: ‘male’}
    

如果想用updata方法,但又不愿意改变原值,就可以生成一个新的对象,用来存储

  1. 先解包在合并字典,先使用**解包,解包完之后在使用dict或者{}合并

    profile = {"name": "xiaoming", "age": 27}
    ext_info = {"gender": "male"}
    full_profile01 = {**profile, **ext_info}
    full_profile02 = dict(**profile, **ext_info)
    #{‘name’: ‘xiaoming’, ‘age’: 27, ‘gender’: ‘male’}
    
  2. 借助itertools内置模块,可迭代对象。正好字典也是可迭代对象,自然就可以使用itertools.chain()函数先将多个字典(可迭代对象)串联起来,组成一个更大的可迭代对象,然后再使用dict转成字典

    import itertools
    
    profile = {"name": "xiaoming", "age": 27}
    ext_info = {"gender": "male"}
    
    
    dict(itertools.chain(profile.items(), ext_info.items()))
    
    #{'name': 'xiaoming', 'age': 27, 'gender': 'male'}
    
  3. 借助ChainMap()如果可以引入一个辅助包,那就可以达到与itertools一样的效果

    from collections import ChainMap
    
    profile = {"name": "xiaoming", "age": 27}
    ext_info = {"gender": "male"}
    
    dict(ChainMap(profile, ext_info))
    
    #{'name': 'xiaoming', 'age': 27, 'gender': 'male'}
    

    但是需要注意的是,当字典间有重复的键值时,ChainMap只会取第一个值,排在后面的键值并不会更新掉前面的(使用itertools就不会出现这个问题)

    from collections import ChainMap
    
    profile = {"name": "xiaoming", "age": 27}
    ext_info={"age": 30}
    dict(ChainMap(profile, ext_info))
    
    #{'name': 'xiaoming', 'age': 27}
    
  4. 如果键已存在,则用新值更新键值,否则加入新键值对

5.删除元素
del dict1['name']   # 删除“键”为“name”的条目
dict1.pop('age')    # 删除并返回“键”为“name”的条目
dict1.clear()       # 删除dict1中的所有条目
del dict1           # 删除dict1这个字典
dict1     # NameError: name 'dict1' is not defined
内建方法
  • dict.clear()删除字典中的所有元素,并返回一个浅拷贝的副本
  • dict.fromkeys(seq, val=None)以序列seq中的元素作为键,创建并返回一个新字典,val为键值对的默认value
  • dict.item()返回一个字典中的键值对元组view object
  • dict.get(key,default=None)对字典中的key,返回value,若key不存在,返回default
  • dict.keys()返回字典中键的view object
  • dict.pop(key,[default])和方法get相似,区别在于不仅返回,还要删除
字典的键

字典中的值可以是任何Python对象,甚至是字典以及用户定义类型,但对于键却是有一些限制的

不允许一个键对对应多个值
dict1 = {'name': 'green', 'age': 20, 'name': 'marry'}
dict1
#{'name': 'marry', 'age': 20}
键必须是可哈希的

可哈希的对象才可以作为键,列表、字典这样的可变类型是不可哈希的,所以不能作为键。所有不可变类型都是可哈希的,都可以作为字典的键。对于数字类型来说值相等的数字表示相同的键

对于可变对象,如果事先调用__hash__()方法并返回一个整型,那它的hash值也是不变的,因此这类对象可以作为键,这是一种特例。

元组中只包括数字、字符串这样的不可变类型,才可以作为字符串的有效键

集合

可变集合(可以进行添加和删减元素,但不可哈希,不可以作为字典的值,可不能作为其他集合的元素)和不可变集合(可哈希)

创建集合

使用大括号将一系列以逗号隔开的值包裹起来就创建了一个集合,另外可以使用内建的set()和frozenset()构造器创建集合

even_numbers = {0, 2, 4, 6, 8}
# 以下用三种方式创建了三个相同的可变集合
set1 = set('abcde')
set2 = set(('a', 'b', 'c', 'd', 'e'))
set3 = set(['a', 'b', 'c', 'd', 'e'])
# 以下用三种方式创建了三个相同的不可变集合
set4 = frozenset('abcde')
set5 = frozenset(('a', 'b', 'c', 'd', 'e'))
set6 = frozenset(['a', 'b', 'c', 'd', 'e'])

当字典作为参数传入set()构造器时,只有键会被时使用

set({'apple': 'red', 'orange': 'orange', 'cherry': 'red'})
#{'apple', 'cherry', 'orange'}
访问集合成员
myset = set(['apple', 'pear', 'grape', 'banana'])
print('apple' in myset)
print('orange' in myset)
for fruit in myset:
    print(fruit)

# True
# False
# pear
# banana
# apple
# grape
更新集合

只有可变集合(set)支持更新

myset = set(['apple', 'pear', 'grape', 'banana'])
myset.add('orange')    # 添加元素
myset
myset.remove('pear')   # 删除元素
newfruit = set(('coco', 'watermelon'))
myset.update(newfruit)   # 更新集合
myset

del newfruit  # 删除集合
集合类型操作符和内建方法

标准类型操作符:

  1. 成员关系判断:in、not in
  2. 集合等价/不等价:==、!、=
  3. 子集/超级判定:<、<=、>、>=

集合类型操作符(用于可变集合和不可变集合):

s = set('abcde')
t = set('defgh')
print(s | t)  # 联合操作,或称OR操作,也就是算并集
print(s & t)  # 求交集操作,或称AND操纵
print(s - t)  # 求差集/相对补集
print(s ^ t)  # 对称差分,类似C中异或操作XOR

集合操作符(用于可变集合):

s = set((1, 3, 5, 7))
t = set((5, 7, 9, 0))
s |= t
print(s)
s &= t
print(s)
s -= t
print(s)
s ^= t
print(s)
集合类型的内建方法
# 用于所有集合的方法
s.issubset(t)            # 如果s是t的子集,返回True
s.issuperset(t)          # 如果s是t的超级,返回True
s.union(t)               # 返回一个新集合(s和t的并集)
s.intersection(t)        # 返回一个新集合(s和t的交集)
s.difference(t)          # 返回一个新集合(s - t)
s.symmetric_difference(t)
                         # 返回一个新集合(s ^ t)
s.copy()                 # 返回一个新集合,它是s的浅复制

# 仅用于可变集合的方法
s.update(t)              # 用t中的元素更新s
s.intersection_update(t) # s中现在是s和t的交集
s.difference_update(t)   # s中现在是(s - t)
s.symmetric_difference_update(t)
                         # s中现在是s和t异或的结果
s.add(obj)               # 在s中添加对象obj
s.remove(obj)            # 从s中删除对象obj,如果不存在则引发KeyError异常
s.discard(obj)           # 如果obj是s的元素,就从s中删除
s.pop()                  # 删除s中任意一个对象,并返回
s.clear()                # 删除集合s中的所有元素
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033975.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号