如果我有五件事情的清单,而我只对其中的第三件和第五件感兴趣,我会在 Erlang 中这样做:
[_First, _Second, Third, _Fourth, Fifth] = ListOfFiveElements,
下划线表示我不关心这些变量,最终结果是第三和第五与该列表中第三和第五位的内容绑定。我如何最好地在 Python 中做同样的事情?
您可以使用元组解包,约定是您可以将 a_
用于您不关心的事情:
>>> ListOf5=['one','two','three','four','five']
>>> _,_,Third,_,Fifth=ListOf5
>>> Third, Fifth
('three', 'five')
只要总数正确,这适用于 Python 中的任何序列:
>>> _,_,Third,_,Fifth=[c for c in 'abcde']
>>> Third, Fifth
('c', 'e')
您还可以构造 RH 元组以匹配分配左侧的元素:
>>> Third,Fifth=ListOf5[2],ListOf5[4]
>>> Third,Fifth
('three', 'five')
并且 - 等待它 - 在 Python 3 中,您可以执行 First、Second、All The Rest 类型的元组赋值:
>>> s1,s2,*s3='abcdefg'
>>> s1,s2,s3
('a', 'b', ['c', 'd', 'e', 'f', 'g'])
>>> s1,*s2,s3='abcdefg'
>>> s1,s2,s3
('a', ['b', 'c', 'd', 'e', 'f'], 'g')
逗号可用于在 Python 中自动解包序列。请注意以下示例,其中我使用列表以不同方式进行分配。
>>> x = [1,2,3,4,5]
>>> a = x
>>> a
[1, 2, 3, 4, 5]
>>> a,b,c,d,e = x
>>> c
3
>>> e
5
>>> a, = x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
基本上,只要您在赋值运算符 ( ) 的左侧包含逗号=
,它就会自动尝试“解包”右侧的操作数。
因此,在您的特定示例的上下文中,您可以对列表执行以下操作:
_First, _Second, Third, _Fourth, Fifth = ListOfFiveElements
编辑:或者正如@drewk 在他的回答中指出的那样,只需使用_
“匹配”任何你不需要的解压元素。
_, _, Third, _, Fifth = ListOfFiveElements
EDIT2:哦,最后一点,如果你在赋值运算符的右侧使用逗号,它会将右侧的所有内容分组到一个元组中,然后将它们分别解包。因此,以下代码将不起作用。
>>> _, _, Third, _, Fifth = ListOfFiveElements,
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
这是因为它从 just 中生成了一个单项元组ListOfFiveElements
。元组被简单地表示为(ListOfFiveElements,)
,然后当它被解包时,它分配ListOfFiveElements
给_
然后找不到更多的东西可以分配给左侧元组的剩余元素:_, Third, _, Fifth
。因此在包含逗号的地方要小心,因为 Python 会将这些内容组合成一个序列。
可以在 Python中使用统一来匹配模式。这本质上是“双向”模式匹配。
from unification import *
a,b = var('a'),var('b')
matched_pattern = unify(["unify","this1","pattern"],[a,"this",b])
if(matched_pattern):
print("Value of a: "+matched_pattern[a])
print("Value of b: "+matched_pattern[b])
else:
print("The pattern could not be matched.")
此示例打印每个变量的值:
Value of a: unify
Value of b: pattern