web-dev-qa-db-ja.com

複数の戻り関数の理解をリストしますか?

2つの値を返す関数があり、リスト内包表記を使用して2つのリストを埋めたいと思います。例えば:

def f(x):
  return 2*x,x*x

x = range(3)
xlist, ylist = [f(value) for value in x]

EDITS from answers below:
xtuple, ytuple = Zip(*[f(value) for value in x])
xlist, ylist = map(list,Zip(*[f(value) for value in x]))

期待されるリターンは次のとおりです。

xlist = [0, 2, 4]
ylist = [0, 1, 4]

私の質問は要約すると:

現在、タプルのリストを取得していますが、これは合理的ですが、2つの独立したリストが必要になります。現在、私は1つのプレースホルダー(タプルリスト)変数と3つの合計内包を持つことができました。しかし、単一のリスト内包としてそれを行うためのクリーンな方法があるかどうか疑問に思っています。

注目に値する:実際のコードでは、2つの戻り値は相関しているため、関数を2つに単純に分割することはできません。

12
Christophe

まず、小さな間違いを犯しました。

_[f(value) for value in x]
#  ^ notice the `value`
_

の代わりに:

_[f(x) for value in x]
_

さらに重要なことは、

_return 2*x,x
_

の略:

_return (2*x,x)
_

そうタプル。したがって、リスト内包表記はタプルのリストを生成するであり、リストのタプルではありません。 Zipのいいところアスタリスクを付けて逆に簡単に使用できること

_xlist,ylist = Zip(*[f(value) for value in x])
#                 ^ with asterisk_

xlistylisttuplesになることに注意してください(Zipは解凍されるため)。それらをリストにしたい場合は、たとえば次のように使用できます。

xlist,ylist = map(list,Zip(*[f(value) for value in x]))

その結果:

_>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]
_

rangesは0から数え始めることに注意してください)

代替:これを行う別の方法はもちろんです:

_xlist = [f(value)[0] for value in x]
ylist = [f(value)[1] for value in x]
_

しかし、これはもちろんinelegantlyであり、さらに非効率になる可能性があります(ただし、fは計算コストがかかります)。

17

組み込み関数を使用 Zip()

def f(x):
  return 2*x, x*x

x = range(1, 4)
xlist, ylist = Zip(*[f(value) for value in x])

print(xlist, ylist)
# ((2, 4, 6), (1, 4, 9))
5
SparkAndShine

これを機能させましょう。関数は問題ありません:

_def f(x):
  return 2*x, x*x
_

ただし、範囲を次のように定義したい場合は、開始値と終了値に注意してください。

_x = range(1, 4)
_

また、パラメーターとしてlistではなく、valueを使用して関数を呼び出す必要があります。そして、結果を2つのリストに解凍する最後の秘訣は、リスト内包の結果を単純にZip(*lst)することです。

_xlist, ylist = Zip(*[f(value) for value in x])
_

これで結果は期待どおりです。

_xlist 
=> [2, 4, 6]
ylist 
=> [1, 4, 9]
_
5
Óscar López

使用する

Zip(*your_list_of_bituples)

demo_list = [(1, 2), (2, 3), (4, 5)]
Zip(*demo_list)

あげる

[(1, 2, 4), (2, 3, 5)]
3
Elmex80s

私はそれが遅いことを知っていますが、以下はあなたが望むものを手に入れます。

def f(value):
    xlist = []
    ylist = []
    for x, y in [(2*x, x*x) for x in range(value)]:
        xlist.append(x)
        ylist.append(y)
    return xlist, ylist

x = int(input("enter a value: "))
xval, yval = f(x)

print(f"xlist = {xval}\nylist = {yval}")
1
K. Solowoniuk