货柜

在某一点上,您可能希望将字符串或数字等对象保留在另一个对象中,以表明它们是强相关的。这些包含其他对象的对象称为 集装箱 。Python提供了相当多的开箱即用的有用容器,下面将介绍其中一些容器。

列表

如果您需要一个灵活的容器,该容器可以容纳任何东西(甚至它本身),并且您需要保持所包含对象的顺序,则应该使用 list 。空列表由以下任一项生成

>>> list()
[]

>>> []
[]

或者生成一个非空列表

>>> list([1, 2, 3])
[1, 2, 3]

>>> [1, 2, 3]
[1, 2, 3]

访问列表的值如下所示:

>>> x = [1, 2, 3]
>>> print(x[1])
2

注解

正如您在上面的示例中看到的,指定 x[1] 没有给你列表的第一个元素,而是第二个元素。这是因为Python从0开始索引!

使用此选项,您还可以更改列表中的值

>>> x = [1, 2, 3]
>>> x[1] = 4
>>> print(x)
[1, 4, 3]

负索引可用于从末尾检索元素:

>>> x = [1, 2, 3, 4, 5]
>>> print(x[-1])
5
>>> print(x[-2])
4

您还可以使用以下表示法创建列表的切片:

list[start:end:step]

它的用法最好用一些例子来说明:

>>> x = ['zero', 'one', 'two', 'three', 'four']
>>> print(x[2:])
['two', 'three', 'four']
>>> print(x[:3])
['zero', 'one', 'two']
>>> print(x[1:3])
['one', 'two']
>>> print(x[::2])
['zero', 'two', 'four']
>>> print(x[::-1])
['four', 'three', 'two', 'one', 'zero']
>>> print(x[-2:])
['three', 'four']

您还可以将值追加到列表中

>>> x = [1, 2, 3]
>>> print(x)
[1, 2, 3]
>>> x.append(4)
>>> print(x)
[1, 2, 3, 4]

或在指定位置插入值

>>> x = [1, 2, 3]
>>> print(x)
[1, 2, 3]
>>> x.insert(0, -1)
>>> print(x)
[-1, 1, 2, 3]
>>> x.insert(1, 0)
>>> print(x)
[-1, 0, 1, 2, 3]

列表可以容纳任何内容,甚至其他列表

>>> [1, 'two', ['three', 4]]
[1, 'two', ['three', 4]]

元组

如果您确定不希望在数据容器生成后对其进行修改,并且希望将所有内容保持在您指定的 tuple 容器是首选的容器。它们可以通过以下方式初始化

>>> tuple([1, 2, 3])
(1, 2, 3)
>>> (1, 2, 3)
(1, 2, 3)

访问单个元素的过程与列表中的操作类似:

>>> x = (1, 2, 3)
>>> print(x[1])
2

当您尝试修改它们时,会引发错误:

>>> x = (1, 2, 3)
>>> x[1] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

集合

如果您不希望容器中有重复项,并且不关心它们的顺序,则应该使用 set 。它们通过以下方式初始化

>>> set()  # This one is empty
set()
>>> set([1, 2, 2, 3, 3, 'three'])  
{1, 2, 3, 'three'}
>>> {1, 2, 2, 3, 3, 'three'}  
{1, 'three', 2, 3}

并且可以按如下方式添加元素:

>>> x = {1, 2, 3}
>>> print(x)  
{1, 2, 3}
>>> x.add('four')
>>> print(x)  
{1, 2, 'four', 3}

Sets 此外,还支持许多您在 set in mathematics 。有关详细信息,请参阅Python文档。

词典

如果您不想保持事物的顺序,但更愿意使用键来访问容器中的对象,则 dict 已经帮你掩护好了。 Dicts 通过以下方式初始化

>>> dict()
{}
>>> {}
{}
>>> x = {'One': 1, 'two': 2, 'THREE': ['A', 'list', 'of', 'strings']}  
{'THREE': ['A', 'list', 'of', 'strings'], 'One': 1, 'two': 2}

它们的值可以这样访问:

>>> x = {'One': 1, 'two': 2, 'THREE': ['A', 'list', 'of', 'strings']}
>>> x['One']
1
>>> x['THREE']
['A', 'list', 'of', 'strings']

如您所见,对于每个键所指向的值的类型没有限制。另一方面,钥匙必须是 hashable 。实际上,密钥通常是 intsstrings 。如果要检索不存在的内容,则会引发错误:

>>> x = {'One': 1, 'two': 2, 'THREE': ['A', 'list', 'of', 'strings']}
>>> x['four']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'four'

在字典中不存在键的情况下提供后备的一种方法是 dict.get() 方法:

>>> x = {'One': 1, 'two': 2, 'THREE': ['A', 'list', 'of', 'strings']}
>>> x.get('two', 'fallback')
2
>>> x.get('four', 'fallback')
'fallback'

常见操作

长度

有时您会对容器容纳的对象数量感兴趣。此信息可以使用 len() 功能:

>>> x = [1, 2, 3]
>>> len(x)
3
>>> x = (1, 2)
>>> len(x)
2
>>> x = set([1, 2, 2, 3, 3, 'three'])
>>> len(x)
4
>>> x = {'One': 1, 'two': 2, 'THREE': ['A', 'list', 'of', 'strings']}
>>> len(x)
3

会员资格检查

>>> x = [1, 2, 3]
>>> 2 in x
True

注解

虽然行为对于 liststuplessets ,即 in 的密钥进行检查。 dictionary

>>> x = {
...    'one': 'two',
...    3: 4
... }
>>> 'one' in x
True
>>> 'two' in x
False
>>> 3 not in x
False
>>> 4 not in x
True

由于实现的性质,成员检查在 setsdictionaries

摘要

  • 使用 lists 如果顺序很重要,并且您可能需要修改容器。

  • 使用 tuples 如果订单很重要并且容器是固定的。

  • 使用 sets 如果顺序并不重要,并且您希望确保容器内的唯一性。

  • 使用 dictionaries 如果要存储键-值对,请执行以下操作。