目录
1. 列表的操作
1.1 索引
① 索引从 0 开始,而不是从 1 开始
language = ['C','C++','Python','Java','SQL']
print(language[0])
print(language[1])
② 索引 -1 ,返回列表最后一个元素,-2,-3...依次类推
language = ['C','C++','Python','Java','SQL']
print(language[-1])
print(language[-2])
③ 字符串的索引
对于字符串字面量以及其他的列表字面量,可直接对其进行索引操作,无需先将其赋给变量。这与先赋给变量,再执行索引操作的效果是一样的。
name = 'Apeiron'
print(name[0])
print('Apeiron'[0])
如果函数调用返回一个序列,可直接对其执行索引操作。
例如:如果我们想获取用户输入年份的第 4 位。
year = input('This year is ')
print(year[3])
1.2 加法
可使用加法运算符来拼接列表。
① 拼接数字列表
numbers = [1,2,3] + [4,5,6]
print(numbers)
② 拼接字符串
demo = 'Hello' + ' ' + 'Python'
print(demo)
③ 拼接数字列表和字符串
demo = [1,2,3] + 'Python'
print(demo)
- 从上图错误消息可知,不能拼接数字列表和字符串,虽然他们都是列表。一般而言,不能拼接不同类型的列表。
1.3 乘法
将列表与数 x 相乘时,将重复这个列表 x 次来创建一个新的列表。
numbers = [7]*7
print(numbers)
2. 列表的成员资格
检查特定的元素是否包含在序列中,可使用 运算符 in。它检查是否满足指定的条件,并返回相应的值:满足时返回 True,不满足时返回 False,这样的运算符被称为 布尔运算符,True 和 False 为 布尔值。
numbers = [1,2,3]
if 1 in numbers:
print('True')
else:
print('False')
一般而言,运算符 in 检查指定的对象是否是序列(或其他集合)的成员(即其中的一个元素),但对字符串来说,只有它包含的 字符 才是其成员或者元素。所以上图序号 ③ 是合理的。
3. 列表的函数
3.1 len() 函数
作用:返回列表中包含的 元素个数,即列表的长度
numbers = [1,2,3,4,5,6,7,8,9,10]
print(len(numbers))
可以用于 冒泡排序算法 中求数字列表的元素个数。
3.2 max () 函数
作用:返回列表中包含的 最大元素
numbers = [1,2,3,4,5,6,7,8,9,10]
print(max(numbers))
3.3 min () 函数
作用:返回列表中包含的 最小元素
numbers = [1,2,3,4,5,6,7,8,9,10]
print(min(numbers))
3.4 sum() 函数
作用:返回列表元素的 总和
numbers = [1,2,3,4,5,6,7,8,9,10]
print(sum(numbers))
3.5 range () 函数
作用 ①:生成一系列数
for value in range(1,5):
print(value)
上述代码好像应该打印数字 1~5,但实际上不会打印 5
这是编程语言中常见的 差一行为 的结果,函数 range() 让 Python 从指定的 第一个值开始数,并在达到你指定的 第二个值停止。因为它在第二个值处停止,所以输出不包括该值(这里为 5)。
注:调用函数 range() 时,也可指定一个参数,这样它将从 0 开始。例如 range(5) ,返回数 0~4。
for value in range(5):
print(value)
作用 ②:指定特定步长,生成特定一系列数
可给这个函数指定 第三个参数,Python 将根据这个步长来生成一系列数。
例如:打印 1~10 的偶数
for i in range(2,11,2):
print(i)
3.6 list () 函数
作用 ①:创建数字列表
即将 range() 作为 list () 的参数,输出一个数字列表。
numbers = list(range(1,6))
print(numbers)
作用 ②:创建字符列表
即将 字符串 作为 list () 的参数,输出一个字符列表
numbers = list('Python')
print(numbers)
4. 列表的方法()
4.1 append ()
作用 ①:将元素加入列表末尾,而不影响列表中的其他所有元素
languages = ['Python','Java','C++']
print(languages)
languages.append('SQL')
print(languages)
作用 ②:创建动态列表
例如,我们可以先创建一个 空列表,在调用 append () 方法来添加元素。
languages = []
print(languages)
languages.append('Python')
languages.append('C++')
languages.append('Java')
print(languages)
这种创建列表的方式极其常见,因为经常要等程序运行后,你才知道用户要在程序中哪些数据。为控制用户,可首先创建一个 空列表,用于存储用户要输入的值,然后将用户提供的每个新值附加到列表中。
append () 是 就地修改列表,这意味着它 不会返回修改后的列表,而是 直接修改旧列表。此时的结果,通常是我们想要的,但有时会带来麻烦。如果,我们想要使用 原始列表,就无法使用。
4.2 clear ()
作用:就地清空列表的内容
languages = ['Python','C++','Java']
print(languages)
languages.clear()
print(languages)
4.3 copy ()
作用:复制列表
a = [1,2,3]
# 把 a 列表复制给 b 列表
b = a
# 给 b 列表中的第二个元素赋值
b[1] = 4
print(a)
print(b)
- 从上图中可以看到,修改 b 列表中的元素,a 列表中的元素也会发生改变。 这种复制只是将另一个名称关联到列表。
a = [1,2,3]
# 把 a 列表复制给 b 列表
b = a.copy()
# 给 b 列表中的第二个元素赋值
b[1] = 4
print(a)
print(b)
- 从上述代码中可以看到,使用 copy ()方法复制列表,a 和 b 就会指向不同的列表,即 b 列表就是 a 列表的副本。改变副本列表 ( b 列表),a 列表也不会发生变化。
4.4 count ()
作用:计算指定的元素在列表中出现的次数
lis = ['to','be','or','not','to','be']
print(lis.count('to'))
numbers = [[1,2],1,1,[2,1,[1,2]]]
print(numbers.count(1))
print(numbers.count([1,2]))
4.5 extend ()
作用:同时将多个值附加到列表末尾,换而言之,我们可以使用一个列表来扩展另一个列表
a = [1,2,3]
b = [4,5,6]
a.extend(b)
print(a)
这可能看起来类似于拼接,但存在一个重要的差别,那就是 a 列表被修改扩展,在 常规拼接 中,情况是返回一个全新的列表,列表 a 没有被改变。
a = [1,2,3]
b = [4,5,6]
print(a+b)
print(a)
如我们所见,拼接出来的列表与前一个示例扩展得到的列表完全相同,但这里的 a 并没有被修改。鉴于常规拼接必须使用 a 和 b 的副本创建一个新的列表,因此如果你要获得类似于下面的效果,拼接的效率将比 extend 低,如下:
a = [1,2,3]
b = [4,5,6]
a = a+b
print(a)
4.6 index ()
作用:在列表中查找指定元素第一次出现的索引
knights = ['We','are','the','knights','who','say','ni']
print(knights.index('who'))
print(knights[4])
print(knights.index('herring'))
从上述代码可以看出,搜索单词 'who' 时,发现它位于索引 4 处。然而,在搜索 'herring' 时引发了异常,因为根本就没有找到这个单词。
4.7 insert ()
作用:将一个对象插入列表
numbers = [1,2,3,5,6,7,8,9]
numbers.insert(3,'four')
print(numbers)
4.8 pop ()
作用:从列表中删除一个元素(默认为最后一个元素) ,并返回这一元素
numbers = [1,2,3]
# 方法中不添加参数,默认删除最后一个元素
# 并且打印 pop() 方法返回的元素
print(numbers.pop())
print(numbers)
# 删除列表中第一个元素
numbers.pop(0)
print(numbers)
注:pop 是唯一既修改列表又返回一个非 None 值的列表方法
使用 pop 可实现一种常见的数据结构 —— 栈(stack),push 和 pop 是大家普遍接受的两种栈操作。Python 没有提供 push ,但可以使用 append 来替代。方法 pop 和 append 的效果相反,因此将刚弹出的值压入(或附加)后,得到的栈与原来相同。
numbers = [1,2,3]
# 从列表弹出一个元素,在将其加入到列表
numbers.append(numbers.pop())
print(numbers)
4.9 remove ()
作用:删除列表中第一个被指定的元素
lis = ['to','be','or','not','to','be']
lis.remove('be')
print(lis)
lis.remove('bee')
print(lis)
如上述代码所见,这只删除了指定的第一个元素,无法删除列表中没有的元素。
注:remove 是就地修改且不返回值的方法之一,不同于 pop 的是,remove 修改列表,但不返回任何值。
4.10 reverse ()
作用:按相反的顺序排列列表中的元素 、
numbers = [1,2,3]
numbers.reverse()
print(numbers)
注:reverse 修改列表,但不会返回任何值(与 remove 和 sort 等方法一样)。
4.11 reversed () 函数
reverse () 方法是按逆序排列列表,此时 原列表被修改。而 reversed () 函数也是按逆序排列列表,但是原列表没有被修改。
numbers = [1,2,3]
print(list(reversed(numbers)))
print(numbers)
注:list () 函数将返回的对象转换为列表
4.12 sort ()
作用:对列表 就地排序,即对原始列表进行修改,使其元素按 默认顺序 (升序) 排列,而不是返回排序后的列表副本
numbers = [10,9,8,7,6,5,4,3,2,1]
numbers.sort()
print(numbers)
4.13 sorted () 函数
sort () 方法将原列表修改排序,但是,有时只需要排序后的列表副本,要保留原始列表不变,这时,sort () 方法就有点力不从心了。此时,sorted () 函数可以完美的解决这一点。
numbers = [5,4,3,2,1]
print(sorted(numbers))
print(numbers)
注:sorted () 函数可用于任何序列,而且总是返回一个列表
5. 列表的解析
先看一个生成列表 squares 的代码:
squares = []
for values in range(1,11):
squares.append(values**2)
print(squares)
上述生成列表 squares 的方式包含三行代码,而 列表解析 让我们只需编写一行代码就能生成这样的列表。列表解析将 for 循环和创建新元素的代码合并成一行,并自动附件新元素。
squares = [value**2 for value in range(1,11)]
print(squares)
要使用这种语法,首先指定一个描述型的 列表名,如 squares 。然后,指定一个左方括号,并定义一个 表达式,用于生成要存储到列表的值。在这个示例中,表达式的值为 value**2,它计算平方值。接下来编写一个 for 循环,用于给表达式提供值,在加上右方括号。
在这个示例中,for 循环为 for value in range(1,11),它将 1~10 提供给表达式 value**2。请注意,这里的 for 语句没有冒号。
6. 传递列表
将列表传递给函数后,函数就能直接访问其内容。下面使用函数来提高处理列表的效率。
假设有一个 编程语言列表,我们要 问候 其中的每位编程语言。下面的示例将包含编程语言的列表,传递给一个名为 greet_languages () 的函数,这个函数问候列表中的每个编程语言:
def greet_languages(languages):
'''向列表中的每位编程语言发出简单的问候'''
for language in languages:
massages = f'Hello, {language.title()}'
print(massages)
programming_languages = ['c++','python','java']
greet_languages(programming_languages)
6.1 在函数中修改列表
将列表传递给函数后,函数就对其进行修改。在函数中对这个列表所做的任何修改都是 永久性 的,这让我们 能够高效地处理大量数据。
假设有一个编程语言列表 programming_languages[],对其中的语言进行简单问候,然后将其列表中所有的元素都移到 repository_languages[] 中。
def greet_languages(programming_languages,repository_languages):
'''向列表中的每位编程语言发出简单的问候'''
# 对编程语言进行问候后,都将其移到 repository_languages 列表中
while programming_languages:
current_languages = programming_languages.pop()
massages = f'Hello, {current_languages.title()}'
repository_languages.append(current_languages)
print(massages)
def show_languages(languages):
for language in languages:
print(language.title())
# 定义一个编程语言列表
programming_languages = ['c++','python','java','javascript','sql']
# 定义一个空列表,用来存储问候后的编程语言
repository_languages = []
# 定义一个函数,对编程语言进行问候
greet_languages(programming_languages,repository_languages)
print(" ")
# 定义一个函数,打印问候后的编程语言
show_languages(repository_languages)
print(" ")
# 打印原始列表,以证明原始列表确实没被修改
print(programming_languages)
print(" ")
6.2 禁止函数修改列表
有时候,需要 禁止函数修好列表,这时,可向函数传递列表的副本而非原件。这样,函数所做的任何修改都只影响副本,而原件丝毫不受影响。
要将列表的副本传递给函数,可像下面这样做:
function_name( list_name[ : ] )
- 切片法表示 [ : ] 创建列表的副本。
def greet_languages(programming_languages,repository_languages):
'''向列表中的每位编程语言发出简单的问候'''
# 对编程语言进行问候后,都将其移到 repository_languages 列表中
while programming_languages:
current_languages = programming_languages.pop()
massages = f'Hello, {current_languages.title()}'
repository_languages.append(current_languages)
print(massages)
def show_languages(languages):
for language in languages:
print(language.title())
# 定义一个编程语言列表
programming_languages = ['c++','python','java','javascript','sql']
# 定义一个空列表,用来存储问候后的编程语言
repository_languages = []
# 定义一个函数,对编程语言进行问候
greet_languages(programming_languages[:],repository_languages)
print(" ")
# 定义一个函数,打印问候后的编程语言
show_languages(repository_languages)
print(" ")
# 打印原始列表,以证明原始列表确实没被修改
print(programming_languages)
print(" ")
虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由,否则还是应该将原始列表传递给函数。这是因为让函数使用现成的列表可避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。
7. 总结
Python 列表相关知识点就总结到这里了,如果有疑问的小伙伴,评论区交流嗷~,笔者必回,我们下期再见啦 !!