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つに単純に分割することはできません。
まず、小さな間違いを犯しました。
_[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
_
xlist
とylist
はtuplesになることに注意してください(Zip
は解凍されるため)。それらをリストにしたい場合は、たとえば次のように使用できます。
xlist,ylist = map(list,Zip(*[f(value) for value in x]))
その結果:
_>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]
_
(range
sは0から数え始めることに注意してください)
代替:これを行う別の方法はもちろんです:
_xlist = [f(value)[0] for value in x]
ylist = [f(value)[1] for value in x]
_
しかし、これはもちろんinelegantlyであり、さらに非効率になる可能性があります(ただし、f
は計算コストがかかります)。
組み込み関数を使用 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))
これを機能させましょう。関数は問題ありません:
_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]
_
使用する
Zip(*your_list_of_bituples)
例
demo_list = [(1, 2), (2, 3), (4, 5)]
Zip(*demo_list)
あげる
[(1, 2, 4), (2, 3, 5)]
私はそれが遅いことを知っていますが、以下はあなたが望むものを手に入れます。
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}")