Python将序列分解为单独的变量

问题

我们有一个包含N个元素的元组或序列,现在想将它分解为N个单独的变量。

解决方案

任何序列(或可迭代对象)都可以通过一个简单的赋值操作来分解为单独的变量。唯一的要求是变量的总数和结构要与序列相吻合。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
>>> p = (3, 4)
>>> x, y = p
>>> x
3
>>> y
4
>>>
>>> data = ['www.revotu.com', 100, 999.99, (2014, 12, 26)]
>>> site, shares, price, date = data
>>> site
'www.revotu.com'
>>> shares
100
>>> price
999.99
>>> date
(2014, 12, 26)
>>> site, shares, price, (year, month, day) = data
>>> site
'www.revotu.com'
>>> shares
100
>>> price
999.99
>>> year
2014
>>> month
12
>>> day
26

无需显示引入第三个变量名,即可交换两个变量的值:

1
2
3
4
5
6
7
8
>>> x = 3
>>> y = 4
>>> x, y = y, x #此时省略了元组的括号,即(y, x)
>>> x
4
>>> y
3
>>>

如果元素数量不匹配,将得到一个错误提示。例如:

1
2
3
4
5
6
>>> p = (3, 4)
>>> x, y, z = p
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
>>>

讨论

实际上不仅仅只是元组或列表,只要对象恰好是可迭代的,那么就可以执行分解操作。这包括字符串、字节、集合、字典、文件、迭代器以及生成器。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
>>> s = 'Python'
>>> a, b, c, d, e, f = s
>>> a
'P'
>>> b
'y'
>>> c
't'
>>> d
'h'
>>> e
'o'
>>> f
'n'
>>>
>>> b = b'ABC'
>>> x, y, z = b
>>> x
65
>>> y
66
>>> z
67
>>>
>>> s = set([1,2,3])
>>> x, y, z = s
>>> x
1
>>> y
2
>>> z
3
>>>
>>> d = dict({1:'A', 2:'B', 3:'C'})
>>> x, y, z = d
>>> x
1
>>> y
2
>>> z
3
>>> x, y, z = d.values()
>>> x
'A'
>>> y
'B'
>>> z
'C'
>>>

当做分解操作时,有时候可能想丢弃某些特定的值。Python并没有提供特殊的语法来实现这一点,但是通常可以选一个用不到的变量名(通常选下划线_),以此来作为要丢弃的值的名称。
例如:

1
2
3
4
5
6
7
>>> data = ['www.revotu.com', 100, 999.99, (2014, 12, 26)]
>>> _, shares, price, _ = data
>>> shares
100
>>> price
999.99
>>>

无论如何请确保选择的变量名没有在其他的地方用到过。

大师兄 wechat
欢迎关注我的微信公众号:Python大师兄