0

この質問は、本質的に具体的ですが、Python に関する一般的な質問に抽象化できます。

いくつかのパラメーターを受け取る関数があるとします。このパラメーターのリストは可変長です。ただし、指定されたパラメーターの型は可変ではありません。パラメータは 3 つのグループに分かれており、最初と 2 番目は float のリストで、3 番目は文字列です。それが繰り返されます。したがって、ある意味では、パラメーターは可変長ではなく、3 の倍数に制限されています。

タイプは何でもかまいません。それらは私の問題に固有のものです。ドキュメントで次のようなmatplotlibプロット関数があります:

a.plot(x1, y1, 'g^', x2, y2, 'g-',...)

ご覧のとおり、3 つのグループの数は、必要に応じて長くすることができます。

すべての x 値 (x1、x2、x3、...) を含むリストのリストと、すべての y 値 (y1、y2、y3、...) を含むリストのリストがあります。これらのリストの長さがわからず (ただし、常に互いに長さが等しい)、特定のインデックスを特定の文字列 (文字列パラメーター用) にマップする辞書があると仮定すると、変数の長さからインデックスを渡すにはどうすればよいですか?この関数へのリストのリスト。

理想的には、次のような疑似コードになると思います。

for element in list_of_lists:
    myFunction(lists_of_lists[element])

ただし、このコードはmyFunctionlist_of_lists 内のすべての要素に対して を実行するだけです。代わりに、パラメーターの長いリストが 1 つ必要で、関数を 1 回だけ実行します。また、この問題は、私の特定の問題だけでなく、Python 全体に関係しているようにも感じます。前もって感謝します!

4

1 に答える 1

1

等しい長さの n 個のリストが与えられた場合 (例):

a = [x1, x2, x3]
b = [y1, y2, y3]
c = ['g^', 'g-', 'g+']

zipは、各リストから 1 つの要素を取得し、渡された順序でタプルに入れます。

この例から、zip(a, b, c)以下が返されます。

[(x1, y1, 'g^'), (x2, y2, 'g-'), (x3, y3, 'g+')]

これをプロットに渡すには:

list_of_tuples = zip(a, b, c)
denormalized = [x for tup in list_of_tuples for x in tup]
plot(*denormalized)

[x for tup in list_of_tuples for x in tup]for x in tupfor each tupinを実行しlist_of_tuples、各 x を順番に最終リストに追加するリスト内包表記です。つまり、タプルのリストをリストにフラット化します。

この例でdenormalizedは、

[x1, y2, 'g^', x2, y2, 'g-', x3, y3, 'g+']

機能的には次のものと同等です。

denormalized = []
for tup in list_of_tuples:
    for x in tup:
        denormalized.append(x)

アンパック演算子 (*) をリストに適用すると、リスト内の各要素が位置引数として渡されたかのように機能する関数を呼び出すように Python に指示します。

于 2013-11-07T20:15:57.917 に答える