如果我列出了五件事,我只对第三件和第五件感兴趣,我会在Erlang中这样做:
[_First, _Second, Third, _Fourth, Fifth] = ListOfFiveElements,
下划线表示我并不关心这些变量,最终结果是第三和第五个与该列表中第三和第五位的内容相关联。我如何才能在Python中做到最好?
答案 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