是否有一个Python等效于Erlang的模式匹配?

时间:2013-09-30 00:10:07

标签: python erlang

如果我列出了五件事,我只对第三件和第五件感兴趣,我会在Erlang中这样做:

[_First, _Second, Third, _Fourth, Fifth] = ListOfFiveElements,

下划线表示我并不关心这些变量,最终结果是第三和第五个与该列表中第三和第五位的内容相关联。我如何才能在Python中做到最好?

3 个答案:

答案 0 :(得分:4)

您可以使用元组解包,惯例是您可以使用_来处理您不关心的事情:

>>> 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元组以匹配赋值的LH侧的元素:

>>> Third,Fifth=ListOf5[2],ListOf5[4]
>>> Third,Fifth
('three', 'five')

并且 - 等待它 - 在Python 3中你可以做第一,第二,所有其他类型的元组赋值:

>>> 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')

答案 1 :(得分:1)

逗号可用于在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

这是因为它只使用ListOfFiveElements创建了一个项目元组。元组简单地表示为(ListOfFiveElements,),然后当它被解压缩时,它会将ListOfFiveElements分配给_,然后找不到更多内容分配给左侧元组的其余元素:_, Third, _, Fifth。因此,在包含逗号的地方要小心,因为Python会将这些内容组合成一个序列。

答案 2 :(得分:0)

可以在Python中使用unification来匹配模式。这本质上是“双向”模式匹配。

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
相关问题