背景は一度
で二つのリストを生成するアルゴリズムは、財務分析を操作します。同じサイズの複数のリストがあり、分析のために他のリストにフィルタリングされます。私は、パラレルリストごとに異なるフィルタリングを行っています。私はa1、b1、c2がリスト内のタプルとして現れるように設定することができますが、分析はタプルを他の方法でストライプ化して分析を行います(他のリストに対してベータなどのリストを回帰させる)。私は3番目のリストに基づいて2つの異なるリストを生成したい
をやりたい
は:
>>> a = list(range(10))
>>> b = list(range(10,20))
>>> c = list(i & 1 for i in range(10))
>>>
>>> aprime = [a1 for a1, c1 in zip(a,c) if c1 == 0]
>>> bprime = [b1 for b1, c1 in zip(b,c) if c1 == 0]
>>> aprime
[0, 2, 4, 6, 8]
>>> bprime
[10, 12, 14, 16, 18]
作成するニシキヘビ/関数型プログラミング/ itertools方法があるはずと思われます2つのリストを繰り返し、3つのリストを1回だけ繰り返します。何かのように:
aprime, bprime = [a1, b1 for a1, b1, c1 in zip(a,b,c) if c1 == 0]
もちろん、これは構文エラーを生成します。
質問
は神託の方法はありますか?
マイクロ最適化戦
醜いが、ニシキヘビツー・マックスワンライナーは、今人気のはtimeitに解決し、私の元のコード「だけforループを使用する」アウトエッジケージマッチ:
>>> import timeit
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\treturn zip(*[(a1,b1) for a1,b1,c1 in zip(a,b,c) if c1==0])\n")
26.977873025761482
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\taprime, bprime = [], [];\n\tfor a1, b1, c1 in zip(a, b, c):\n\t\tif c1 == 0:\n\t\t\taprime.append(a1); bprime.append(b1);\n\treturn aprime, bprime\n")
32.232914169258947
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\treturn [a1 for a1, c1 in zip(a,c) if c1 == 0], [b1 for b1, c1 in zip(b,c) if c1 == 0]\n")
32.37302275847901
なぜあなたは並行してリストを反復処理しようとしていますか?あなたが解決しようとしている全体的な問題は何ですか?おそらく、複数の並列リストを反復しようとするよりも簡単です。 –
アルゴリズムは財務分析を操作します。同じサイズの複数のリストがあり、分析のために他のリストにフィルタリングされます。実際には、パラレルリストごとに異なるフィルタリングを行っています。私はa1、b1、c2がリスト内のタプルとして現れるように設定することができますが、分析はタプルを他の方法でストライプ化して分析を行います(他のリストに対してベータなどのリストを回帰させる)。 – hughdbrown
aprimeとbprimeを作成するためのコードに問題がないとは思いません。どのような方法でそれが間違っているか不適切であるか? –