0

みなさんおはようございます、

私の簡単な質問は次のとおりです。長さ T の 2 つのリスト (それらをaおよびbと呼びましょう) があり、それぞれから K 個のランダム要素 (同じインデックスを持つ) を削除したいと考えています。
同じインデックスが 2 回以上抽出される確率を無視するために、今のところ K << T とします。K 個の乱数のリストaleaindexを生成し、それをdelに渡すことはできますか?

for i in range(K):
    aleaindex.append(random.randint(0, T-1))
del a[aleaindex]
del b[aleaindex]

そして、これをより効率的に行うためのPythonのトリックはありますか?
事前にどうもありがとうございました!

4

1 に答える 1

1

いいえ、これを行う方法はありません。

これは、 が名前をdel削除するためです。オブジェクトに別の名前が付いている場合、その名前は引き続き存在します。オブジェクト自体は無傷です。

オブジェクトをリストに格納する場合、オブジェクトには名前が付けられず、インデックスだけが付けられます。

これは、オブジェクトのリストがある場合、Python はそれらのオブジェクトを参照する名前 (存在する場合) を認識しないため、それらを削除できないことを意味します。せいぜい、その特定のリストからそれらを削除できます。

最善の解決策は、不要な値を含まない新しいリストを作成することです。これは、リスト内包表記で実現できます。

new_a = [v for i, v in enumerate(a) if i not in aleaindex]

リストを変更する必要aがある場合は、いつでもこれを に割り当てることができます ( )。a[:] = ...

aleaindexセットを作成すると、この操作が高速になり、順序は問題にならないため、セットを作成する方が理にかなっていることに注意してください。

aleaindex = {random.randint(0, T-1) for _ in range(K)}
于 2013-05-30T10:06:01.013 に答える