1

如果我有五件事情的清单,而我只对其中的第三件和第五件感兴趣,我会在 Erlang 中这样做:

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

下划线表示我不关心这些变量,最终结果是第三和第五与该列表中第三和第五位的内容绑定。我如何最好地在 Python 中做同样的事情?

4

3 回答 3

4

您可以使用元组解包,约定是您可以将 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')
于 2013-09-30T00:44:47.647 回答
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

这是因为它从 just 中生成了一个单项元组ListOfFiveElements。元组被简单地表示为(ListOfFiveElements,),然后当它被解包时,它分配ListOfFiveElements_然后找不到更多的东西可以分配给左侧元组的剩余元素:_, Third, _, Fifth。因此在包含逗号的地方要小心,因为 Python 会将这些内容组合成一个序列。

于 2013-09-30T00:42:28.480 回答
0

可以在 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
于 2019-01-17T23:18:41.163 回答