1

私の問題は、ループ内で挿入/追加メソッドを管理することです。

長さのリストが 2 つありますN。最初のリスト ( と呼びましょうs) はサブセットを示し、2 番目のリストはx評価したい量を表します。簡単にするために、すべてのサブセットが T 個の要素を表すとしましょう。

cont = 0;
for i in range(NSUBSETS):
    for j in range(T):
        subcont = 0;
        if (x[(i*T)+j] < 100):
            s.insert(((i+1)*T)+cont, s[(i*T)+j+cont]);
            x.insert(((i+1)*T)+cont, x[(i*T)+j+cont]);
            subcont += 1;
    cont +=  subcont;

2 つのリストのすべての要素を巡回しているときに、特定の条件 (例: x[i] < 100) が満たされると、その要素のコピーがサブセットの最後に配置され、完了するまでループが続行されます。サブセットのすべての元のメンバーの分析。「順序」を維持することが重要です。つまり、元のサブセットの最後の要素の隣に要素を挿入します。

サブセット内およびグローバルにそれぞれ作成されたコピーの数を 2 つのカウンター変数内に格納する方法があると考えました (コードを参照)。おそらく Python マジックを使用して、それを行うためのより簡単な方法があるかどうか疑問に思います。

4

5 に答える 5

2

リスト全体の完全なコピーを作成せずに、追加のコピーをリストに補間することを考えている場合は、ジェネレータ式でこれを試すことができます。リストをループしながら、追加する一致を収集します。処理するたびに各アイテムを生成し、収集した各アイテムも生成します。

これは、リストが 1 つだけの単純化された例ですが、うまくいけばアイデアを示しています。私がやったようにして、ジェネレーターを理解して展開した場合にのみ、コピーを取得します。処理されたリストを保存したり、さらに分析したいだけの場合 (たとえば、ディスクに書き込むため)、それをメモリに保持することはできません。

def append_matches(input_list, start, end, predicate):
  # where predicate is a filter function or lambda
  for item in input_list[start:end]:
    yield item
  for item in filter(predicate, input_list[start:end]): 
    yield item

example = lambda p:  p < 100
data = [1,2,3,101,102,103,4,5,6,104,105,106]

print [k for k in append_matches (data, 0, 6, example)]
print [k for k in append_matches (data, 5, 11, example)]

[1, 2, 3, 101, 102, 103, 1, 2, 3]
[103, 4, 5, 6, 104, 105, 4, 5, 6]
于 2013-05-30T06:28:50.763 に答える
0

あなたのリストのコピーを作成してから、元のリストをループしながら、挿入する基準に出くわしたときに、必要な場所にコピーを挿入したいと思います。その後、コピーおよび更新されたリストを出力できます。

于 2013-05-29T16:02:29.840 に答える
-1

1 つの可能性は、numpy の高度なインデックス作成を使用して、元のリストの「コピー」インデックスのリストを作成し、それを各サブセットを表すインデックス/スライス リストに追加することで、サブセットの最後に要素をコピーする錯覚を提供することです。次に、最後にすべてのインデックス/スライス リストを結合し、最終的なインデックス リストを使用してすべてのアイテムにアクセスします (高度なインデックス作成/スライスとして役立つジェネレータ スタイルもサポートされていると思います)。ビューではなくコピーを返します)。コピーする基準を満たす要素の数に応じて、各サブセットがスライス オブジェクトとしてインデックスを持ち、追跡する必要があるインデックスの数を減らすため、これはかなり効率的です。

于 2013-05-29T19:02:42.790 に答える