元组

元组 属于 Python

15 个练习

关于 元组

一个 元组 是_不可变_的、按_顺序_排列的元素集合。

与大多数集合一样(参见内置的list、dict和set),tuples可以存放任意(或多种)数据类型,包括其他tuples。 元组的元素可以使用for item in <tuple>结构来迭代。 如果同时需要元素的下标和值,可以使用for index, item in enumerate(<tuple>)。

与任何 序列 一样,tuples中的元素可以通过_方括号表示法_访问,即使用从左起的0-based index编号,或从右起的-1-based index编号。 元组可以通过_切片表示法_或<tuple>.copy()整体或部分复制,并支持所有 常见序列操作。 由于_不可变_,tuples不支持可变序列操作。

元组占用的内存空间远小于其他集合类型,并且使用下标访问时具有常量(O(1))级的访问时间。 不过,元组一旦创建,就无法调整大小、排序或修改,所以在需要频繁更改或更新数据时灵活性较差。 如果需要频繁更新或扩展,list、collections.deque或array.array可能是更合适的数据结构。


元组构造

元组有多种创建方式,既可以使用tuple类构造器,也可以使用(<element_1>, <element_2>)(tuple字面量)声明。

以空参数或_可迭代对象_使用tuple()构造器:

>>> no_elements = tuple()
()

# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)

字符串是可迭代的,所以把单个str作为实参传给tuple()构造器可能会得到意想不到的结果:

# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')

其他可迭代对象的元素也会被逐一添加进去:

>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)

>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)

dict的默认迭代对象是键。 如果要把字典中的键和值都放进元组,请使用<dict>.items(), 它会返回一个由(key, value)tuples组成的迭代器。

>>> source_data = {"fish": "gold", "monkey": "brown"}

>>> multiple_elements_dict_1 = tuple(source_data)
('fish', 'monkey')

>>> multiple_elements_dict_2 = tuple(source_data.items())
(('fish', 'gold'), ('monkey', 'brown'))
将元组声明为_字面量_:

由于tuple()构造器只接受_可迭代对象_(或者不接受任何参数)作为实参,所以用字面量方式创建单元素元组要容易得多。

>>> no_elements = ()
()

>>> one_element = ("Guava",)
("Guava",)

注意,一般来说创建tuple字面量并不需要括号,只需要逗号。 不过,在大多数情况下,使用(<element_1>, <element_2>)被认为更具可读性。 在存在歧义的情况下也需要括号,比如空元组、单元素元组,或者函数把元组作为实参接收时。

>>> elements_separated_with_commas = "Parrot", "Bird", 334782
("Parrot", "Bird", 334782)

>>> elements_with_commas_and_parentheses = ("Triangle", 60, 60, 60)
("Triangle", 60, 60, 60)

其他数据结构也可以作为tuple的元素,包括其他tuples。

>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))

>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))

元组可以用加号+运算符拼接,它会展开每个tuple,创建一个新的、合并后的tuple。

>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("George", 5, "cat", "Tabby")

#likewise, using the multiplication operator * is the equivalent of using + n times
>>> first_group = ("cat", "dog", "elephant")

>>> multiplied_group = first_group * 3
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')

访问数据

元组中的元素(和其他序列类型str和list一样)可以通过_方括号表示法_访问。 下标可以从**left-->right(从 0 开始),也可以从right-->left**(从 -1 开始)。 元组还可以通过_切片表示法_或<tuple>.copy()整体或部分复制。

>>> student_info = ("Alyssa", "grade 3", "female", 8)

#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa

>>> student_name = student_info[-4]
Alyssa

#age is at index 3 or index -1
>>> student_age_1 = student_info[3]
8

>>> student_age_2 = student_info[-1]
8

遍历元素

元组中的元素可以在循环中使用for item in <tuple>语法_遍历_。 如果同时需要下标和值,可以使用for index, item in enumerate(<tuple>)。

>>> student_info = ("Alyssa", "grade 3", "female", 8)
>>> for item in student_info:
...   print(item)
...
Alyssa
grade 3
female
8

>>> for index, item in enumerate(student_info):
...  print("Index is: " + str(index) + ", value is: " + str(item) + ".")
...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.

元组作为同质信息

元组常被用作_记录_,其中的数据在_组织上_或_概念上_是同质的,并被当作单一的信息单元,即使各个元素属于_异质_的数据类型。

>>> student_info = ("Alyssa", "grade 3", "female", 8)

当需要同质的不可变数据序列来实现hashability、存入set,或创建字典的键时,也会用到元组。

注意,虽然tuples在大多数情况下是_不可变_的,但由于它们可以包含_任何_数据结构或对象,只要其中某个元素是_可变类型_,它们就可能_变得可变_。 在tuple中使用可变数据类型,会使包含它的tuple不可哈希。

>>> cmyk_color_map = {
        (.69, .3, .48, .1) : ("Teal 700", (59, 178, 146), 0x3BB292),
        (0, .5, 1, 0) : ("Pantone 151", (247, 127, 1), 0xF77F01),
        (.37, .89, 0, .44) : ("Pantone 267", (89, 16, 142), 0x59108E),
        (0, 1, .46, .45) : ("Pantone 228", (140, 0, 76), 0x8C004C)
    }

>>> unique_rgb_colors = {
        (59, 178, 146),
        (247, 127, 1),
        (89, 16, 142),
        (140, 0, 76),
        (76, 0, 140)
     }

>>> teal_700 = hash((59, 178, 146))

>>> teal_700 = hash(("Pantone 228", [(140, 0, 76), 0x8C004C]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

扩展元组及相关数据类型

元组常被用作_记录_,但其中的数据只能通过_位置_/_下标_访问。 collections模块中的namedtuple()类扩展了元组的基本功能,允许按_名称_访问元素。 此外,用户还可以改造dataclass来提供类似的具名属性功能,不过各有利弊。

通过 GitHub 编辑 该链接会在新窗口或标签页中打开

学习 元组

练习已锁定

再解锁 5 个练习即可练习 元组