関数呼び出しのアスタリスク


111

itertools.chainを使用して、この方法でリストのリストを「フラット化」します。

uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))

これは言うこととどう違うのですか?

uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))

8
見てください引数リストをアンパック詳細についてはPythonのドキュメントでは。
カイ

8
また、**演算子を確認する必要があります-演算子と同じことを*行いますが、キーワード引数を使用します。
Sean Vieira

回答:


181

* "splat"演算子です:リストを入力として受け取り、それを関数呼び出しの実際の位置引数に展開します。

uniqueCrossTabsだったなら[ [ 1, 2 ], [ 3, 4 ] ]、それitertools.chain(*uniqueCrossTabs)は言うことと同じですitertools.chain([ 1, 2 ], [ 3, 4 ])

これは単に渡すだけの場合とは明らかに異なりuniqueCrossTabsます。あなたの場合、フラット化したいリストのリストがあります。何itertools.chain()行い、各位置引数は、それ自体で反復可能であり、あなたはそれに渡すすべての位置引数の連結の反復子を返します。

つまり、各リストをuniqueCrossTabs引数としてに渡しchain()、それらを一緒にチェーンしますが、リストを別々の変数に持たないため、*演算子を使用してリストのリストをいくつかのリスト引数に展開します。

Jochen Ritzelがコメントで指摘したように、chain.from_iterable()最初は反復可能オブジェクトの単一の反復可能オブジェクトを想定しているため、この操作にはより適しています。その後、コードは単純になります。

uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))

9
@larsmans:この用語はRubyの世界でより人気があると思いますが、Pythonでも受け入れられるようです。言うのは楽しいので、好きです ;-)
Cameron

1
@larsmans:面白い!リストを引数リストにアンパックするアクションであり、実際のキャラクター自体ではない、といつも思っていました。
Cameron

1
文字列がイテラブルとしてみなされるとは限らないため、文字列はおそらく最良の例ではありません。ところで:chain(*it)私は書く代わりにchain.from_iterable(it)
Jochen Ritzel、2011年

@ヨッヘン:その通りです。代わりに数字を使用するように変更します。また、from_iterable存在すら知らなかった!私はすぐにそれを私の答えに追加します
キャメロン

1
@Ramy:*リストを関数の位置引数に分解するためだけです(そう、非常に具体的です)。あなたはfor l in uniqueCrossTabs:それらを繰り返すために行うことができます。残念ながら*、リストを関数に渡すときにのみ機能するので(最初のパラメーターとしてリストを渡すのではなく、リスト*内の各要素が個別のパラメーターとして次々と渡されます) 、まるでパラメーターリストでカンマで区切って入力されたかのように)
Cameron

72

シーケンスを関数呼び出しの個別の引数に分割します。

>>> def foo(a, b=None, c=None):
...   print a, b, c
... 
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
...   print a
... 
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)

例による簡潔な説明。+1!
AruniRC 2018年

28

概念を説明する/それを使用するための単なる代替方法。

import random

def arbitrary():
    return [x for x in range(1, random.randint(3,10))]

a, b, *rest = arbitrary()

# a = 1
# b = 2
# rest = [3,4,5]

3
これは重要であり、他の場所では言及されていません
Gershom '19 / 10/19

1
この回答は特に質問には当てはまりませんが、アスタリスクの重要なアプリケーションです(そのため、「霧」のタイトルでは適切だと思います)。同じように、もう1つの重要なアプリケーションは関数定義です。def func(a, b, *args):詳細については、この回答を参照してください。
ASL、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.