Python - List

本文详细介绍了Python中的列表数据结构,包括其创建、元素操作、与数组、集合和字典的区别,以及常用的方法如添加、删除和访问元素。

Python | ShareTechnote

Python中的列表(List)

Python列表与任何其他语言的数组相似,但它具有更多的方法(功能)来处理列表中的元素。

Python列表是一个内置的数据结构,用于存储可变、有序的元素序列。列表非常灵活,可以在创建后添加、删除或修改元素。

要创建一个列表,可以使用方括号[]并用逗号分隔元素。可以使用一对空方括号[]创建一个空列表。列表中的元素可以是任何数据类型,包括其他列表,这使得它们适用于各种应用。由于列表是可变的,因此在列表创建后可以添加、删除或修改元素。

列表的主要特点是它们是有序的,这意味着元素在其列表中保持其位置。可以使用元素的索引访问列表中的单个元素,从0开始表示第一个元素,1表示第二个元素,依此类推。负索引可用于从列表末尾访问元素,-1表示最后一个元素,-2表示倒数第二个元素,依此类推。

Python提供了各种内置方法来操作列表,例如:

len():返回列表中的元素个数。
append():在列表末尾添加一个元素。
extend():将另一个可迭代对象(如另一个列表)的元素添加到列表末尾。
insert():在指定索引处插入一个元素。
remove():从列表中删除第一个出现的元素的实例。
pop():删除并返回指定索引处的元素,如果未提供索引,则返回列表中的最后一个元素。
index():返回列表中第一个出现的元素的索引。
count():返回列表中元素的出现次数。
sort():原地对列表元素进行排序。
reverse():原地反转列表中元素的顺序。
copy():返回列表的浅拷贝。

数组、集合和字典的区别

数组、集合和字典都是Python中的集合数据结构,但在属性和使用场景上有一些关键区别。以下是它们之间的主要区别的概述:

数组:

数组是固定大小的、可变的、有序的元素集合,通常具有相同的数据类型。
可以通过索引访问和修改元素,实现快速高效的随机访问。
数组不是Python中的内置数据结构,但可以通过array模块或其他库(如NumPy)使用。
适用场景:当需要存储和操作相同数据类型的元素时,数组非常适合,特别是在处理大量数值数据或需要对数据执行数学运算的情况下。

集合:

集合是无序的、唯一的、可哈希的元素集合。
集合不允许重复元素,不支持索引或切片。
集合是可变的,可以在创建后添加或删除元素。
集合是Python中的内置数据结构,可以使用set()构造函数或花括号{}创建。
适用场景:当需要存储唯一元素、执行成员测试或执行数学集合操作(如并集、交集和差集)时,集合非常适合。

字典:

字典以无序的方式存储键值对集合。
键必须是唯一的且可哈希,而值可以是任何数据类型。
字典是可变的,可以在创建后添加、删除或更新键值对。
字典是Python中的内置数据结构,可以使用花括号{}或dict()构造函数创建。
适用场景:当需要根据键存储和操作数据时,字典非常适合,例如存储配置设置、计算单词频率或实现缓存机制。

示例:

以下是显示各种操作和用法的列表的示例。

注意1:本页面中的所有示例都是用Python 3.x编写的。如果您使用的是Python 2.x,可能无法正常工作。

注意2:除非特别提及,否则本页面中的所有示例都假定是在Windows 7上编写/运行的。您可能需要根据操作系统稍作修改语法。

创建列表:空列表 - 示例1
创建列表:数字项 - 示例2
创建列表:字符串项 - 示例3
创建列表:二维列表 - 示例4
获取列表的长度(大小) - 示例5
访问列表:获取一个项目 - 示例6
访问列表:从二维列表获取一个项目 - 示例7
访问列表:获取一组项目 - 示例8
访问列表:按间隔获取项目 - 示例9
访问列表:获取每隔一个项目 - 示例10
遍历列表:for循环 - 示例11
列表中的成员检查 - 示例12
遍历二维列表中的每个项目 - 示例13
遍历具有不规则行大小的二维列表中的每个项目 - 示例14

< Example 1 >

 

aList = []

print(aList)

 

Result :----------------------------------

[]

 

 

< Example 2 >

 

aList = [1, 2, 3, 4, 5]

print(aList)

 

Result :----------------------------------

[1, 2, 3, 4, 5]

 

 

< Example 3 >

 

aList = ["Item1","Item2","Item3"]

bList = ['Item1','Item2','Item3']

print(aList)

print(bList)

 

Result :----------------------------------

['Item1', 'Item2', 'Item3']

['Item1', 'Item2', 'Item3']

 

 

< Example 4 >

 

aList2D = [[1,2,3],[4,5,6]]

print(aList2D)

 

Result :----------------------------------

[[1, 2, 3], [4, 5, 6]]

 

 

< Example 5 >

 

aList = [1,2,3]

aList2D = [[1,2,3],[4,5,6]]

print(len(aList))

print(len(aList2D))

print(len(aList2D[0]))

 

Result :----------------------------------

3

2

3

 

 

< Example 6 >

 

aList = ["Item1","Item2","Item3"]

print(aList[2],aList[1],aList[0])

 

Result :----------------------------------

Item3 Item2 Item1

 

 

< Example 7 >

 

aList2D = [[1,2,3],[4,5,6]]

print(len(aList2D[0]))

print(len(aList2D[0][1]))

 

Result :----------------------------------

[1,2,3]

2

 

 

< Example 8 >

 

aList = [0,1,2,3,4,5,6,7,8,9]

print(aList[2:6])

 

Result :----------------------------------

[2, 3, 4, 5]

 

 

< Example 9 >

 

 

aList = [0,1,2,3,4,5,6,7,8,9]

print(aList[2:8:2])  # syntax is aList[start:stop:step]

 

Result :----------------------------------

[2, 4, 6]

 

 

< Example 10 >

 

aList = [0,1,2,3,4,5,6,7,8,9]

print(aList[::2])  

print(aList[2::2])

 

Result :----------------------------------

[0, 2, 4, 6, 8]

[2, 4, 6, 8]

 

 

< Example 11 >

 

aList = [0,1,2,3,4,5,6,7,8,9]

 

for i in aList :

   print("current i =",i)

 

Result :------------------------------------

 

current i = 0

current i = 1

current i = 2

current i = 3

current i = 4

current i = 5

current i = 6

current i = 7

current i = 8

current i = 9

 

 

< Example 12 >

 

fruits = ["Apple","BlueBerry","Banana","SrawBerry"]

 

print("'Apple' in fruits = ",("Apple" in fruits))

print("'Bean' in fruits = ",("Bean" in fruits))

 

 

Result :------------------------------------

 

'Apple' in fruits =  True

'Bean' in fruits =  False

 

 

< Example 13 >

 

aList2D = [

           [11,12,13],

           [21,22,23],

           [31,32,33]

           ];

 

// To do this, you need to specify row/col size

print("======================")  

print("[")

for r in range(0,3) :

    print("[",end='')

    for c in range(0,3) :

        print(aList2D[r][c],end='')

        print(" ",end='')

    print("]")

print("]")

 

// To do this, you do not need to specify row/col size

print("======================")

print("[")

for r in aList2D :

    print("[",end='')

    for c in r :

        print(c,end='')

        print(" ",end='')

    print("]")

print("]")

 

 

Result :------------------------------------

 

======================

[

[11 12 13 ]

[21 22 23 ]

[31 32 33 ]

]

======================

[

[11 12 13 ]

[21 22 23 ]

[31 32 33 ]

]

 

 

 

< Example 14 >

 

aList2D = [

           [11,12],

           [21,22,23,24,25],

           [31,32,33]

           ];

 

print("======================")

print("[")

for r in aList2D :

    print("[",end='')

    for c in r :

        print(c,end='')

        print(" ",end='')

    print("]")

print("]")

 

 

Result :------------------------------------

 

======================

[

[11 12 ]

[21 22 23 24 25 ]

[31 32 33 ]

]

 

 

< Example 15 >

<think>我们需要从多行文本中提取特定的邮件地址"python-list@python.org",但要求不包含前缀(如From:,To:等)。我们可以使用正则表达式来匹配该邮件地址,同时确保不会匹配到其他相似但不完全相同的邮件地址。思路:1.直接匹配"python-list@python.org"字符串,但这样可能会匹配到包含该字符串的其他邮箱(如admin@python-list@python.org)或者上下文不同的情况。2.更可靠的方法是匹配一个完整的邮箱地址,并且只匹配我们指定的那个。由于邮箱地址通常是由字母、数字、点、下划线、横线等组成的,我们可以用字符类来定义。但是,题目要求只提取"python-list@python.org",不包含前缀。所以我们可以使用正则表达式来匹配这个特定的字符串,并且确保它前后没有其他字符使得它成为另一个邮箱的一部分。一种方法是使用单词边界`\b`来确保我们匹配的是完整的邮箱地址。正则表达式:`\bpython-list@python\.org\b`注意:点号需要转义,因为点号在正则中表示任意字符。但是,如果这个邮箱地址出现在一行中间,并且前后都是非单词字符(例如在尖括号< >中,或者引号内),那么单词边界可能就不太适用了。另外,我们还需要考虑这个邮箱地址可能出现在行首或行尾。另一种方法是使用负向断言(lookaround)来确保邮箱地址的前后不是其他可能导致它成为更大字符串一部分的字符。但是,由于题目中指定了具体的邮箱地址,且不包含前缀,我们可以考虑这个邮箱地址是独立的,或者被非字母数字字符包围(比如空格、逗号、分号、尖括号等)。我们可以这样写:`(?:^|\s)(python-list@python\.org)(?:\s|$)`但是这样会匹配到前后的空格,而捕获组只捕获邮箱地址。但这样会要求在邮箱前后必须有空格或行边界,但在实际邮件头中,邮箱地址可能出现在逗号分隔的列表中,或者被尖括号包围。更通用的方法是匹配邮箱地址,并且使用非捕获组来匹配可能的前后缀,但只捕获邮箱部分。实际上,由于我们明确知道要提取的字符串,并且这个字符串是固定的,我们可以直接使用:正则表达式:`python-list@python\.org`然后检查匹配的上下文是否是一个独立的邮箱地址。但为了精确,我们可以这样:考虑常见的邮箱地址格式:-可能被尖括号包围:<python-list@python.org>-可能被双引号包围(较少)-可能作为逗号分隔列表的一部分所以,我们可以写一个正则表达式,匹配可能出现的边界情况,并使用捕获组来提取邮箱部分。但是,题目要求只提取"python-list@python.org"而不包含前缀,我们可以在匹配时使用非捕获组来忽略前缀,但在这里我们不需要前缀,所以实际上我们只关心这个字符串本身。然而,为了避免匹配到类似“test-python-list@python.org”这样的字符串,我们可以使用负向断言:正则表达式:`(?<!\w)python-list@python\.org(?!\w)`这个表达式的意思是:邮箱地址前面不能是单词字符(比如字母、数字、下划线),后面也不能是单词字符。这样就能确保匹配的是完整的邮箱地址。但是,在邮件头中,邮箱地址可能被放在尖括号中,例如:<python-list@python.org>。在这种情况下,邮箱地址前面是尖括号,它不是单词字符,所以可以匹配。同样,后面是尖括号,也可以匹配。所以,我们可以使用这个正则表达式。我们来写代码演示:假设文本是多行的,我们使用re.MULTILINE标志,但实际上这个正则表达式不涉及行首行尾,所以不需要特别处理多行模式。代码示例:</think> # 多行文本中提取指定邮箱地址的方法 要提取"python-list@python.org"邮箱地址而不包含前缀(如To:、Cc:等),可以使用以下方法: ## 方法1:直接匹配邮箱地址 ```python import re text = """From: john.doe@example.com To: python-list@python.org From: jane.doe@example.com To: admin@python.org, python-list@python.org Cc: python-list@python.org""" # 查找所有匹配的邮箱地址 matches = re.findall(r'\bpython-list@python\.org\b', text) print("匹配结果:", matches) ``` **输出:** ``` 匹配结果: ['python-list@python.org', 'python-list@python.org', 'python-list@python.org'] ``` **解释:** - `\b` 表示单词边界,确保匹配完整的邮箱地址 - 使用反斜杠对点号 `.` 进行转义,因为点号在正则中有特殊含义 - 直接匹配完整邮箱字符串 ## 方法2:使用前瞻后顾断言提取不含前缀的地址(更精确) ```python import re text = """From: john.doe@example.com To: python-list@python.org From: jane.doe@example.com To: admin@python.org, python-list@python.org Cc: python-list@python.org""" # 使用零宽断言确保邮箱前面没有字母数字字符 pattern = r'(?<!\w)python-list@python\.org(?!\w)' matches = re.findall(pattern, text) print("精确匹配结果:", matches) ``` **解释:** - `(?<!\w)` 表示"前面不能是单词字符"(零宽负向后行断言) - `(?!\w)` 表示"后面不能是单词字符"(零宽负向先行断言) - 这样可以确保只匹配完整的"python-list@python.org"而不匹配任何前缀 ## 方法3:从邮件头字段中提取邮箱地址 ```python import re text = """From: john.doe@example.com To: python-list@python.org From: jane.doe@example.com To: admin@python.org, python-list@python.org Cc: python-list@python.org""" # 匹配邮件头字段中的指定邮箱 matches = [] for header in ['From:', 'To:', 'Cc:']: pattern = fr"{header}.*?\b(python-list@python\.org)\b" for match in re.finditer(pattern, text, re.IGNORECASE): matches.append(match.group(1)) print("提取结果:", matches) ``` **输出:** ``` 提取结果: ['python-list@python.org', 'python-list@python.org', 'python-list@python.org'] ``` **解释:** - `fr"{header}.*?\b(python-list@python\.org)\b"` 使用格式化字符串创建正则 - `re.IGNORECASE` 使匹配不区分大小写 - 使用捕获组 `( )` 只获取邮箱部分 - 遍历多个可能的邮件头字段进行匹配 ## 方法4:处理多个邮箱的复杂情况 ```python import re text = """To: admin@python.org, python-list@python.org CC: support@python.org; python-list@python.org From: python-list@python.org <no-reply@lists.python.org>""" # 匹配邮件头字段中的多个邮箱地址 pattern = r"(?:From|To|Cc):\s*([\w\s\-,;<>@\.]*python-list@python\.org[\w\s\-,;<>@\.]*)" all_headers = re.findall(pattern, text, re.IGNORECASE) matches = [] for header in all_headers: # 从单个头部提取所有邮箱 emails = re.findall(r'\bpython-list@python\.org\b', header) matches.extend(emails) print("复杂情况提取结果:", matches) ``` **输出:** ``` 复杂情况提取结果: ['python-list@python.org', 'python-list@python.org', 'python-list@python.org'] ``` **解释:** 1. 首先匹配可能包含多个邮箱的整个头部内容 2. 然后从中提取具体的"python-list@python.org"地址 3. 这种方式可以处理邮箱列表(逗号/分号分隔)和带名称的邮箱格式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值