Python 中有四种内置的数据结构——列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)。
列表是一种用于保存一系列有序项目的集合。
是一种可变的数据类型。
列表是使用对象和类的实例。
在Python中,用方括号([] )来表示列表,并用逗号来分隔其中的元素。
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
输出结果:
['trek', 'cannondale', 'redline', 'specialized']
如果直接打印列表(列表名),Python将打印列表的内部表示,包括方括号。
类似于数组元素的下标访问。
索引从0开始而不是1 。
Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1 ,可让Python返回最后一个列表元素:
print(bicycles[-1]) #返回最后一个元素
经常需要在不知道列表长度的情况下访问最后的元素。这种约定也适用于其他负数索引,例如,索引-2 返回倒数第 二个列表元素,索引-3 返回倒数第三个列表元素,以此类推。
修改列表元素的语法与访问列表元素的语法类似。要修改列表元素,指定列表名和要修改的元素的索引,在指定元素的新值。
motorcycles = ['honda', 'yamaha', 'suzuki']motorcycles[0] = 'ducati'
python 提供了在多种既有列表中添加新数据的方式
在列表末尾添加元素
函数append()
将新元素添加到列表末尾,而不影响列表中其他所有元素
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.append('ducati')
这种方法可以动态地创建列表
motorcycles = [] #创建空列表motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
在列表中插入元素
函数insert()
可在列表的任何位置添加新元素。为此,需要指定新元素的索引和值。
这种操作将列表中既有的每个元素都右移一个位置
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(0, 'ducati') #insert()函数两个参数
结果
['ducati', 'honda', 'yamaha', 'suzuki']
使用 del
语句删除元素
如果知道要删除的元素在列表中的位置,可使用 del
语句。
motorcycles = ['honda', 'yamaha', 'suzuki']
del motorcycles[1] #指定删除第二个元素
使用 pop()
函数删除元素
pop()
可删除列表末尾的元素,并且返回该元素。此时列表就像一个栈,删除列表末尾元素相当于弹出栈顶元素。
motorcycles = ['honda', 'yamaha', 'suzuki']
last_owned = motorcycles.pop()
弹出列表中任何位置处的元素
实际上,你可以使用pop()
来删除列表中任何位置的元素。此时需要传递给 pop()
函数参数。
motorcycles = ['honda', 'yamaha', 'suzuki']
first_owned = motorcycles.pop(0) #pop 函数指定了参数
如果你不确定该使用
del
语句还是pop()
方法,下面是一个简单的判断标准:如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用
del
语句;如果你要在删除元素后同时还需要继续使用它,就使用方法
pop()
。
根据值删除元素
有时候,你不知道要从列表中删除的值所处的位置。如果你只知道要删除的元素的值,可使用方法remove()
,该函数无返回值。
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']ve('ducati')
注意 方法
remove()
只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
sort()
对列表进行永久排序举例:
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()
永久性地修改了列表元素的排列顺序
还可以按与字母顺序相反的顺序排列列表元素,为此,只需向sort()
方法传递参数reverse=True
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort(reverse=True)
sorted()
对列表进行临时排序要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()
。函数sorted()
让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。
举例:
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(cars)
print(sorted(cars))
print(cars)
sorted()
函数返回一个新的排序列表。
如果你要按与字母顺序相反的顺序显示列表,也可向函数sorted()
传递参数reverse=True
要反转列表元素的排列顺序,可使用方法reverse()
。
cars = ['bmw', 'audi', 'toyota', 'subaru']
verse()
使用函数len()
可快速获悉列表的长度。
cars = ['bmw', 'audi', 'toyota', 'subaru']
len(cars)
和 c/c++ 一样注意数组越界问题。
别忘了,每当需要访问最后一个列表元素时,都可使用索引-1 。这在任何情况下都行之有效,即便你最后一次访问列表后,其长度发生了变化。
range()
for value in range(1,5): print(value)
上述代码好像应该打印数字1~5,但实际上它不会打印数字5
在这个示例中,range()
只是打印数字1~4,这是你在编程语言中经常看到的差一行为的结果。
函数range()
让Python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出不包含第二个值(这里为5)。
添加第三个参数可以确定步长
range()
创建数字列表可使用函数list()
将range()
的结果直接转换为列表。
将range()
作为list()
的参数。
numbers = list(range(1,6))
print(numbers)
使用函数range() 几乎能够创建任何需要的数字集,例如创建一个平方值列表
squares = []for value in range(1,11):squares.append(value**2)print(squares)
有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的最大值
、最小值
和总和
:
>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45
前面介绍的生成列表squares 的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表。
列表解析:将for 循环和创建新元素的代码合并成一行,并自动附加新元素。
新列表名 = [表达式 for 更新表达式的for语句]
squares = [value**2 for value in range(1,11)]
首先指定一个描述性的列表名,如squares
;然后,指定一个左方括号,并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式 为value**2
,它计算平方值。接下来,编写一个for
循环,用于给表达式提供值,再加上右方括号。
列表的部分元素——Python称之为切片
创建切片
指定要使用的第一个元素和最后一个元素的索引。
与函数range() 一样,Python在到达你指定的第二个索引前面的元素后停止。
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
结果:['charles', 'martina', 'michael']
如果没有指定第一个索引,python将自动从列表头开始
print(players[:4])
结果:['charles', 'martina', 'michael', 'florence']
要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第3个元素到列表末尾的所有元素,可将起始索引指定为2 ,并省略终止索引。
print(players[2:])
Python将返回从第3个元素到列表末尾的所有元素:['michael', 'florence', 'eli']
负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片。 例如,如果你要输出名单上的最后三名队员,可使用切片players[-3:]
。 又如 players[:-1]
从开始到倒数第二个。
你同样可以在切片操作中提供第三个参数,这一参数将被视为切片的==步长(Step)==(在默认 情况下,步长大小为 1)
>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::1]
['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::2]
['apple', 'carrot']
>>> shoplist[::3]
['apple', 'banana']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']
当步长为 2 时,我们得到的是第 0、2、4…… 位项目。当步长为 3 时,我们得到 的是第 0、3……位项目。
举例:
players = ['charles', 'martina', 'michael', 'florence', 'eli']print("Here are the first three players on my team:") #输出前三个
for player in players[:3]: #在切片中遍历print(player.title())
应用举例:
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:]
)。这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]
相当于深拷贝/浅拷贝:如果直接用赋值号
=
将就列表名赋值给新列表,这种语法实际上是让Python将新变量friend_foods 关联到包含 在my_foods 中的列表,因此这两个变量都指向同一个列表。(相当于两个指针指向同一个变量,并不是复制(出一个新的),两个变量实际上同一个。)
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组 。
元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])
像列表一样,也可以使用for 循环来遍历元组中的所有值:
dimensions = (200, 50)
for dimension in dimensions:print(dimension)
虽然不能修改元组的元素,但可以给存储元组的变量赋值,即重新定义整个元组。
相比于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。
在Python中,字典 是一系列 键—值
对 。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。
事实上,可将任何Python对象用作字典中的值。
字典是属于 dict
类下的实例或对象
在Python中,字典用放在花括号{}
中的一系列键—值对表示:
alien_0 = {'color': 'green', 'points': 5}
print(alien_0) #直接打印字典
冒号
分隔,而键—值对之间用 逗号
分隔。要获取与键相关联的值,可依次指定字典名和放在方括号内的键
alien_0 = {'color': 'green'}
print(alien_0['color'])
结果:green
字典是一种动态结构,可随时在其中添加键—值对。
要添加键—值对,可依次指定字典名、用方括号括起的键和相关联的值。
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)alien_0['x_position'] = 0 #添加新的键值对
alien_0['y_position'] = 25 #添加新的键值对
print(alien_0)
注意:键—值对的排列顺序与添加顺序不同。Python不关心键—值对 的添加顺序,而只关心键和值之间的关联关系。
有时候,在空字典中添加键—值对是为了方便,而有时候必须这样做。为此,可先使用一对空的花括号定义一个字典,再分行添加各个键—值对。
alien_0 = {}alien_0['color'] = 'green'
alien_0['points'] = 5print(alien_0)
结果:{'color': 'green', 'points': 5}
使用字典来存储用户提供的数据或在编写能自动生成大量键—值对的代码时,通常都需要先定义一个空字典。
要修改字典中的值,可依次指定字典名、用方括号括起的键以及与该键相关联的新值。
alien_0 = {'color': 'green'}
print("The alien is " + alien_0['color'] + ".")alien_0['color'] = 'yellow' #将与键 'color' 相关联的值改为'yellow'
print("The alien is now " + alien_0['color'] + ".")
对于字典中不再需要的信息,可使用del 语句将相应的键—值对彻底删除。
使用del
语句时,必须指定字典名和要删除的键。
alien_0 = {'color': 'green', 'points': 5}del alien_0['points'] #码从字典alien_0 中删除键'points' 及其值
也可以使用字典来存储众多对象的同一种信息。
鉴于字典可能包含大量的数据,Python支持对字典遍历。字典可用于以各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键—值对、键或值。
user_0 = {'username': 'efermi','first': 'enrico','last': 'fermi',}
for key, value in user_0.items():print("nKey: " + key)print("Value: " + value)
简化变量名的形式
for k, v in user_0.items()
items()
,它返回一个键—值对列表。注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。
在不需要使用字典中的值时,方法keys()
很有用。
favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',}for name in favorite_languages.keys():print(name.title())
结果:
Jen
Sarah
Phil
Edward
遍历字典时,会默认遍历所有的键,
因此,如果将上述代码中的
for name in favorite_languages.keys():
替换为for name in favorite_languages:
,
输出将不变。
显示地使用
keys()
可以让代码更容易理解。
要以特定的顺序返回元素,一种办法是在for 循环中对返回的键进行排序。为此,可使用函数sorted()
来获得按特定顺序排列的键列表的副本
favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',}
for name in sorted(favorite_languages.keys()):print(name.title() + ", thank you for taking the poll.")
如果你感兴趣的主要是字典包含的值,可使用方法 values()
,它返回一个值列表,而不包含任何键。
favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',}print("The following languages have been mentioned:")
for language in favorite_languages.values():print(language.title())
这种方法可能会包含重复项,为了剔除重复项,可使用集合 set
。
Set 类似与列表,但是每个元素都是独一无二的。
favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',}print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):print(language.title())
通过对包含重复元素的列表调用
set()
,可让Python找出列表中独一无二的元素,并使用这些元素来创建一个集合。
有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套 。
你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。
下面代码创建了一个包含三个外星人的列表
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}aliens = [alien_0, alien_1, alien_2] #字典列表
自动生成举例:
# 创建一个用于存储外星人的空列表
aliens = []
# 创建30个绿色的外星人
for alien_number in range(30):new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}aliens.append(new_alien)
有时候,需要将列表存储在字典中,而不是将字典存储在列表中。
# 存储所点比萨的信息
pizza = {'crust': 'thick','toppings': ['mushrooms', 'extra cheese'],}for topping in pizza['toppings']: #打印字典中的列表print("t" + topping)
注意 列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单的解决问题的方案。
可在字典中嵌套字典,但这样做时,代码可能很快复杂起来。
users = { #先定义了一个 users 的字典,包含两个键,与每个键相关的值都是字典'aeinstein': {'first': 'albert','last': 'einstein','location': 'princeton',},'mcurie': {'first': 'marie','last': 'curie','location': 'paris',},
}
for username, user_info in users.items():print("nUsername: " + username)full_name = user_info['first'] + " " + user_info['last']location = user_info['location']print("tFull name: " + full_name.title())print("tLocation: " + location.title())
列表、元组和字符串可以看作序列(Sequence)的某种表现形式。
序列的主要功能是资格测试(Membership Test)(也就是 in
与not in
表达式)和索引 操作(Indexing Operations),它们能够允许我们直接获取序列中的特定项目。
上面所提到的序列的三种形态——列表、元组与字符串,同样拥有一种切片(Slicing)运算 符,它能够允许我们序列中的某段切片——也就是序列之中的一部分。
这些操作前面已经提到过,略。
集合(Set)是简单对象的无序集合(Collection)。
当集合中的项目存在与否比起次序或其出现次数更加重要时,我们就会使用集合。
>>> bri = set(['brazil', 'russia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = py()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
>>> ve('russia')
>>> bri & bric # OR bri.intersection(bric)
{'brazil', 'india'}
当你创建了一个对象并将其分配给某个变量时,变量只会查阅(Refer)某个对象,并且它也 不会代表对象本身。也就是说,变量名只是指向你计算机内存中存储了相应对象的那一部 分。这叫作将名称绑定(Binding)给那一个对象。
这里要注意的是深拷贝和浅拷贝的问题。
本文发布于:2024-02-02 04:02:58,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681794541232.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |