学习如何使用Python列表

137 阅读12分钟

列表是按特定顺序排列的项目的集合。它们允许你将各种类型的数据作为单独的元素存储在列表中。Python 列表可能是 Python 编程语言中最常用的结构类型。列表的概念即使对较新的程序员来说也是相当容易掌握的,它们是 Python 中的一个重要基础概念,因为它们是 Python 编程中许多不同概念的一部分。在本教程中,我们将学习所有关于如何使用Python列表的知识。


什么是 Python 列表?

列表是[Python 中的]一种[数据结构],是一个可变的、有序的元素序列。可变的意思是,列表可以被改变。列表中的每个元素都被称为一个项目。当你想处理几个相关的值时,列表是很好的选择。它们使组织数据或同时对多个元素执行相同的操作变得容易。你可以制作一个包括0-9的数字、字母或你最喜欢的冰淇淋的名字的列表。虽然在列表中把相关的项目分组是很常见的,但你可以把任何你想要的东西放到列表中,即使它们没有关系。由于一个列表通常有不止一个元素,所以列表的变量名往往是复数。


如何在 Python 中定义一个列表

就像[字符串被定义]为引号之间的字符一样。 **' '**一样,列表是通过方括号之间的值来定义的。 [ ].这个代码片段在 Python 中定义了一个空列表。

empty_list = []

下面是一个有不同蔬菜的列表例子。列表中的各个元素用逗号分开。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']

当你在 Python 中使用**print()**函数来显示一个列表时,它会返回一个列表的表示,包括方括号。输出结果看起来就像我们创建的列表。

print(veggies)
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']

在一个列表中混合类型

这个例子中的列表有一个整数类型、一个字符串数据类型、一个布尔值、一个列表和一个字典,都是作为列表的元素包含的。

many_types = [7, 'letter', True, ['Kale', 'Cabbage'], {'Garlic': 2, 'Okra': 1, 'Carrot': 5}]
for item in many_types:
    print(type(item))
<class 'int'>
<class 'str'>
<class 'bool'>
<class 'list'>
<class 'dict'>

Python 列表的动作和方法

Python 中的所有东西都是一个对象,而对象有方法。你可以用这些提供的方法进行各种操作。列表对象有几个有用的方法可以用来处理列表。让我们在这里看一下其中的几个。


.count()

count()方法返回指定元素在列表中出现的次数。这是**count()**方法的语法。

list.count(element)

count()在调用时只接受一个参数,那就是要计算出现的元素。考虑一下我们的蔬菜列表。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
lettuce = veggies.count('Lettuce')

print(f'You have {lettuce} lettuce.')
You have 1 lettuce.

.count()方法确认了我们已经知道的事情,即列表中只有一个'Lettuce'。如果列表中有多个 'Lettuce',.count() 方法可以计算 'Lettuce' 出现的次数并给出值。这就引出了我们下一个 Python 列表方法,那就是 .append()。

list.append()

append()方法将一个项目添加到列表的末尾。append() 方法的语法如下。

list.append(item)

append()需要一个参数item,即要添加到列表末尾的项目。由于我们可以把任何数据类型放在 list 里面,被添加的项目可以是字符串、[数字]、列表、字典或任何其他数据类型。让我们把另一个'Lettuce'添加到我们的列表中,这样我们就可以再次测试 count() 方法了。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.append('Lettuce')
print(veggies) 
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce', 'Lettuce']

很好!现在我们可以再试一下count()函数,看看结果如何。

lettuce = veggies.count('Lettuce')
print(f'You have {lettuce} lettuce.')
You have 2 lettuce.

list.index()

index()列表方法返回列表中指定元素的索引。其语法如下。

list.index(element, start, end)

list index() 方法有三个可能的参数。

  • element- 要搜索的元素
  • start(可选) - 从这个索引开始搜索
  • end(可选) - 搜索到此索引的元素

index()方法返回列表中给定元素的索引,如果没有找到该元素,你将得到一个ValueError异常。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
asparagus = veggies.index('Asparagus')

print(f'Asparagus is at index {asparagus}')
Asparagus is at index 3

Asparagus "在索引3处。这是因为列表从0开始,而不是从1开始。因为第一个索引是0,最后一个索引比列表的大小少一个。

如果提供了第二个参数,这就是index()从左到右开始搜索的地方。在这里的例子中,我们从4开始搜索。 由于'Asparagus'在索引3处,所以没有找到这个项目,并且出现了一个异常。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
asparagus = veggies.index('Asparagus', 4)

print(f'Asparagus is at index {asparagus}')
Traceback (most recent call last):
  File "C:/python/justhacking/lists.py", line 2, in <module>
    asparagus = veggies.index('Asparagus', 4)
ValueError: 'Asparagus' is not in list

在接下来的这个例子中,我们将为index()方法使用三个参数。我们可以指定要搜索的元素,开始搜索的索引,以及结束搜索的索引。由于我们寻找的项目确实在开始和结束索引值之间,那么我们就有一个成功的索引查询。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
celery = veggies.index('Celery', 1, 3)

print(f'Celery is at index {celery}')
Celery is at index 2

要想在 Python 中看到列表中每个项目的索引,你可以使用这个整洁的小代码片段,它使用enumerate() 函数来提供一个我们可以在 for 循环中访问的索引。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
for i, veggie in enumerate(veggies):
    print(f'{veggie} is at index {i}')
Kale us at index 0
Cabbage us at index 1
Celery us at index 2
Asparagus us at index 3
Lettuce us at index 4

如果你知道某个项目的索引,那么使用方括号中的 **[ ]**符号来访问该项目,就像这样。

print(veggies[1])
print(veggies[0])
print(veggies[3])
print(veggies[2])
print(veggies[4])
Cabbage
Kale
Asparagus
Celery
Lettuce

list.reverse()

如果你想颠倒列表中项目的顺序,你可以调用reverse()list 方法。它们的语法如下。

list.reverse()

.reverse()方法没有参数,它在原地反转列表。这意味着它不返回一个值,而是修改实际的列表。这就是为什么
,你会使用veggies.reverse(),而不是veggies = veggies.reverse()

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.reverse()

print(veggies)
['Lettuce', 'Asparagus', 'Celery', 'Cabbage', 'Kale']

在使用了reverse()方法之后,我们可以再一次使用index()方法。我们可以看到'Asparagus'已经改变了它所处的索引位置。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.reverse()

# veggies is now ['Lettuce', 'Asparagus', 'Celery', 'Cabbage', 'Kale']
asparagus = veggies.index('Asparagus')
print(f'Asparagus is at index {asparagus}')
Asparagus is at index 1

reverse()方法永久地改变了列表的顺序,但是如果你需要的话,你可以通过对同一个列表第二次应用 reverse()方法回到原来的顺序。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.reverse()

asparagus = veggies.index('Asparagus')
print(f'Asparagus is at index {asparagus}')

veggies.reverse()

asparagus = veggies.index('Asparagus')
print(f'Now it is at index {asparagus}')
Asparagus is at index 1
Now it is at index 3

list.clear()

clear()方法从列表中删除所有项目,其语法如图所示。

list.clear()

clear() 方法不接受任何参数,也不返回一个值。它只是清空了一个给定的列表。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.clear()

print(veggies)
[]

list.copy()

copy()方法用于创建一个列表的浅层拷贝,其语法在此显示。

copy_of_list = list.copy()

copy() 方法不接受任何参数,并返回一个新的列表。它并不改变原始列表。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies_copy = veggies.copy()

print(veggies)
print(veggies_copy)
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']

有趣的是,这些看起来是同一个列表。它们持有相同的内容,但它们实际上是两个完全独立的列表。我们可以通过在每个变量上运行**id()**函数来证明这一点,看看它们各自都有自己的唯一 id。

print(id(veggies))
print(id(veggies_copy))
58068200
58067816

一个列表可以用**=**操作符来复制,但是这样复制列表的问题是,如果你把原来的*或*新的列表,两个列表都同时受到这个变化的影响。这是因为复制的列表只是一个引用。在这种情况下,你得到的基本上是两个不同名称的变量,它们都指向内存中的同一个位置。同样,id()函数可以向我们展示这一点。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies_copy = veggies

print(id(veggies))
print(id(veggies_copy))
59313384
59313384

因此,如果你想对一个列表做一个新的拷贝,同时确保每个列表都是完全唯一的,请使用**.copy()方法而不是=**操作符。

list.extend()

如果你有两个想加在一起的列表,你可以使用 Python 中的**extend()**列表方法。它将一个可迭代的所有元素添加到列表的末尾。这意味着你也可以添加除列表以外的东西,如字符串、图元或另一个迭代器。语法如下。

list.extend(iterable)

就像 append()、remove()、sort()和reverse()一样,extend() 方法修改了原始列表。它不返回任何值。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
moar_veggies = ['Okra', 'Garlic']

veggies.extend(moar_veggies)

print(veggies)
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce', 'Okra', 'Garlic']

当你添加的迭代对象是一个元组、集合、字符串或字典时,这个方法也能起作用。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
moar_veggies = ('Okra', 'Garlic')

veggies.extend(moar_veggies)

print(veggies)
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce', 'Okra', 'Garlic']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
moar_veggies = {'Okra', 'Garlic'}

veggies.extend(moar_veggies)

print(veggies)
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce', 'Okra', 'Garlic']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
moar_veggies = 'Broccoli'

veggies.extend(moar_veggies)

print(veggies)
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce', 'B', 'r', 'o', 'c', 'c', 'o', 'l', 'i']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
moar_veggies = {'Broccoli': 'Yummy'}

veggies.extend(moar_veggies)

print(veggies)
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce', 'Broccoli']

list.insert()

除了我们学过的 append() 方法之外,还有一个**.insert()**方法可以用来向列表中添加项目。append()与insert()的区别在于,使用append(),值被添加到列表的末尾。当使用insert()方法时,一个值可以被插入到列表的任何地方。insert()方法的语法如下。

list.insert(i, elem)

insert()方法只是简单地返回None,并更新现有的列表。要在列表的开头插入一个元素,使用索引0。要在第三个位置插入一个元素,请使用索引2。

veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.insert(0, 'Spinach')

print(veggies)
['Spinach', 'Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.insert(2, 'Tomato')

print(veggies)
['Kale', 'Cabbage', 'Tomato', 'Celery', 'Asparagus', 'Lettuce']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggie_tuple = ('Turnip', 'Cucumber')
veggies.insert(2, veggie_tuple)

print(veggies)
['Kale', 'Cabbage', ('Turnip', 'Cucumber'), 'Celery', 'Asparagus', 'Lettuce']

list.pop()

pop()方法用于从列表的末端弹出一个项目。在这个过程中,有两件事发生。原始列表被修改,被移除的项目被返回,因此你可以将该项目存储在一个变量中。如果你给pop方法传递一个索引值,你就可以指定哪一个项目从列表中被弹出。pop()方法的语法是。

list.pop(index)

  • pop() 方法只接受一个参数(index)。
  • 如果没有传递参数,默认的索引**-1**将作为参数传递(最后一个项目的索引)。
  • 如果传递给该方法的索引不在范围内,你将得到一个IndexError: pop index out of range 异常。
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
most_favorite = veggies.pop()

print(most_favorite)
Lettuce
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
least_favorite = veggies.pop(0)

print(least_favorite)
Kale
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
least_favorite = veggies.pop(5)

print(least_favorite)
Traceback (most recent call last):
  File "C:/python/justhacking/lists.py", line 2, in <module>
    least_favorite = veggies.pop(5)
IndexError: pop index out of range

list.remove()

如果你不会知道你想从列表中删除的值的位置,但你仍然想删除它,你可以使用remove()方法。它从列表中删除第一个匹配的元素(作为参数传递),其语法是。

list.remove(element)

  • remove() 方法接受一个元素作为参数并将其从列表中删除。
  • 如果该元素不是圆的,它会抛出ValueError: list.remove(x): x 不在列表中的异常。
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.remove('Kale')

print(veggies)
['Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.remove('Celery')

print(veggies)
['Kale', 'Cabbage', 'Asparagus', 'Lettuce']

list.sort()

Python 的**sort()**方法使得对一个列表进行排序变得很容易。它以升序或降序对给定列表中的元素进行排序,其语法是。

list.sort(key=..., reverse=...)

  • reverse- 如果为真,列表将以反向(降序)顺序排序
  • key- 你定义的一个用于排序比较的函数
  • sort()方法在原地修改了原始列表。
  • 如果你想返回排序后的列表,而不是改变原始列表,请使用 sorted() 。
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.sort()

print(veggies)
['Asparagus', 'Cabbage', 'Celery', 'Kale', 'Lettuce']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.sort(reverse=True)

print(veggies)
['Lettuce', 'Kale', 'Celery', 'Cabbage', 'Asparagus']
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.sort(key=lambda i: len(i), reverse=True)

print(veggies)
['Asparagus', 'Cabbage', 'Lettuce', 'Celery', 'Kale']

什么是 list() 函数?

类似于 str(17) 将返回 '17', 整数 17 的字符串表示,list()函数将返回传递给它的值的一个列表版本。使用list()函数的一个有用的情况是,如果你需要一个元组值的可变版本,可以将一个元组转换为一个列表。

veggies = ('Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce')

print(veggies)
print(list(veggies))
('Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce')
['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']

如何使用列表的随机性

有时你想从一个列表中得到一个随机值,Python 提供了一个非常简单的方法,用随机模块来实现这个目的。

import random
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']

surprise = random.choice(veggies)

print(surprise)
Lettuce

如何使用 Python List 摘要

在本教程中,我们学习了什么是列表以及如何处理列表中的各个项目。我们学习了如何定义一个列表,如何添加和删除元素,以及对列表进行排序。我们看了一下我们可以在列表中使用的内置[Python 方法]。列表是一种有用的数据类型,因为它允许你写代码,在一个单一变量中保存的值的集合上工作。