Python 编程/元组
外观
Python 中的元组与列表非常相似,区别在于元组一旦创建就是不可变的(不可更改)。可哈希对象的元组是可哈希的,因此适合作为字典中的键和集合中的成员。
Python 中的元组一览
tup1 = (1, 'a')
tup2 = 1, 'a' # Brackets not needed
tup3 = (1,) # Singleton tuple
tup4 = 1, # Singleton tuple without brackets
tup5 = () # Empty tuple
list1 = [1, 'a']
it1, it2 = tup1 # Assign items by "value unpacking"
print(tup1 == tup2) # True
print(tup1 is tup2) # False
print(tup1 == list1) # False
print(tup1 == tuple(list1)) # True
print(list(tup1) == list1) # True
print(tup1[0]) # First member
for item in tup1: print(item) # Iteration
print((1, 2) + (3, 4)) # (1, 2, 3, 4)
print(tup1 * 2) # (1, 'a', 1, 'a')
tup1 += (3,) # Tuple and string concatenation work similarly
print(tup1) # (1, 'a', 3), despite immutability *
# * From docs: "For immutable targets such as strings, numbers, and tuples,
# the updated value is computed, but not assigned back to the input variable."
print(len(tup1)) # Item count
print(3 in tup1) # Membership - True
tup6 = ([1,2],)
tup6[0][0]=3
print(tup6) # The list referred to by a tuple remains mutable
set1 = set( (1,2) ) # Can be placed into a set
#set1 = set( ([1,2], 2) ) # Error: The list within makes it unhashable
def foo():
return 6, 9 # Return multiple values, as a tuple
r1, r2 = foo() # Receive multiple values
print(f'r1 is {r1}, r2 is {r2}')
元组可以直接创建,也可以从列表转换。通常,元组用括号括起来。
>>> l = [1, 'a', [6, 3.14]]
>>> t = (1, 'a', [6, 3.14])
>>> t
(1, 'a', [6, 3.14])
>>> tuple(l)
(1, 'a', [6, 3.14])
>>> t == tuple(l)
True
>>> t == l
False
一个元素的元组是用括号中的元素后跟一个逗号来创建
>>> t = ('A single item tuple',)
>>> t
('A single item tuple',)
此外,元组将由用逗号分隔的元素创建。
>>> t = 'A', 'tuple', 'needs', 'no', 'parens'
>>> t
('A', 'tuple', 'needs', 'no', 'parens')
您还可以使用元组执行多重赋值。
>>> article, noun, verb, adjective, direct_object = t #t is defined above
>>> noun
'tuple'
请注意,赋值运算符的两侧,或者两侧都可以包含元组。
>>> a, b = 1, 2
>>> b
2
上面的例子:article, noun, verb, adjective, direct_object = t 被称为“元组解包”,因为元组t 被解包,其值被分配给左侧的每个变量。“元组打包”是相反的:t=article, noun, verb, adjective, direct_object。解包元组或执行多重赋值时,分配的变量数量必须与分配的值数量相同。
这些与列表相同,除了我们不能分配给索引或切片,并且没有“append”运算符。
>>> a = (1, 2)
>>> b = (3, 4)
>>> a + b
(1, 2, 3, 4)
>>> a
(1, 2)
>>> b
(3, 4)
>>> a.append(3)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'tuple' object has no attribute 'append'
>>> a
(1, 2)
>>> a[0] = 0
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object does not support item assignment
>>> a
(1, 2)
对于列表,我们将有
>>> a = [1, 2]
>>> b = [3, 4]
>>> a + b
[1, 2, 3, 4]
>>> a
[1, 2]
>>> b
[3, 4]
>>> a.append(3)
>>> a
[1, 2, 3]
>>> a[0] = 0
>>> a
[0, 2, 3]
长度:查找元组的长度与列表相同;使用内置的 len() 方法。
>>> len( ( 1, 2, 3) )
3
>>> a = ( 1, 2, 3, 4 )
>>> len( a )
4
使用内置的 tuple() 方法将列表转换为元组。
>>> l = [4, 5, 6]
>>> tuple(l)
(4, 5, 6)
使用内置的 list() 方法将元组转换为列表,以将其强制转换为列表
>>> t = (4, 5, 6)
>>> list(t)
[4, 5, 6]
字典也可以使用字典的 items 方法转换为元组对的元组
>>> d = {'a': 1, 'b': 2}
>>> tuple(d.items())
(('a', 1), ('b', 2))
元组可以用在列表代替的位置,其中项目的数量已知且较小,例如,从函数返回多个值时。许多其他语言需要创建对象或容器来返回,但使用 Python 的元组赋值,多值返回很容易
def func(x, y):
# code to compute x and y
return x, y
这个生成的元组可以使用上面解释的元组赋值技术轻松解包
x, y = func(1, 2)
有时需要操纵元组中包含的值以创建新的元组。例如,如果我们想找到一种方法来使元组中的所有值翻倍,我们可以结合上面的一些信息以及列表推导,如下所示
def double(T):
'double() - return a tuple with each tuple element (e) doubled.'
return tuple( [ e * 2 for e in T ] )
- 创建列表 ['a', 'b', 'c'],然后从该列表创建元组。
- 创建元组 ('a', 'b', 'c'),然后从该元组创建列表。(提示:完成此操作所需的材料已介绍,但并不完全明显)
- 同时进行以下实例化:a = 'a', b=2, c='gamma'。(也就是说,在一行代码中)。
- 创建一个只包含一个元素的元组,该元素又包含三个元素 'a'、'b' 和 'c'。使用 len() 函数验证长度实际上为 1。
- Python 文档,第“序列类型”章 -- python.org
- Python 文档,第“元组和序列”章 -- python.org