5 つのリストがあり、そのうちの 3 番目と 5 番目だけに関心がある場合、Erlang で次のようにします。
[_First, _Second, Third, _Fourth, Fifth] = ListOfFiveElements,
アンダースコアは、それらの変数を気にしないことを意味し、最終結果として、3 番目と 5 番目は、そのリストの 3 番目と 5 番目にあるものにバインドされます。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')
割り当ての LH 側の要素と一致するように 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
これは、 から 1 項目のタプルを作成するためですListOfFiveElements
。タプルは次のように単純に表され(ListOfFiveElements,)
、アンパックされると、タプルの左側の残りの要素に割り当てられListOfFiveElements
ます。したがって、Python はこれらをシーケンスにグループ化するため、コンマを含める場所に注意してください。_
_, Third, _, Fifth