[解決済み] リストからランダムな要素をポップする最も効率的な方法は何ですか?
質問
あるリストがあるとします
x
があり、そこからランダムに1つの要素をポップして、リストがその要素を含まないようにしたいとします。これを行うための最もpythonicな方法は何ですか?
私は、かなり手間のかかる
pop
,
random.randint
そして
len
といった、より短い、あるいはより良い解決策を見たいと思います。
import random
x = [1,2,3,4,5,6]
x.pop(random.randint(0,len(x)-1))
私が実現しようとしているのは、リストからランダムな要素を連続的にポップすることです。(すなわち、ある要素をランダムにポップして辞書に移動し、別の要素をランダムにポップして別の辞書に移動する、...)
私はPython 2.6を使用しており、検索機能を介して任意のソリューションを見つけることができなかったことに注意してください。
どのように解決するのですか?
あなたがしようとしていることは、そもそもPython的ではなさそうです。リストの途中のものを削除してはいけません。なぜなら、私が知っているすべてのPythonの実装では、リストは配列として実装されているので、これは
O(n)
の操作になります。
アルゴリズムの一部としてこの機能が本当に必要であれば、以下のようなデータ構造をチェックアウトする必要があります。
blist
のような、中間からの効率的な削除をサポートするデータ構造をチェックする必要があります。
純粋なPythonでは、残りの要素にアクセスする必要がない場合にできることは、最初にリストをシャッフルして、それに対して反復処理を行うだけです。
lst = [1,2,3]
random.shuffle(lst)
for x in lst:
# ...
もし、あなたが
本当に必要なら
が必要な場合 (これはちょっとしたコード臭です、IMHO)、少なくともあなたは
pop()
をリストの最後から呼び出すことができます(これは速いです!)。
while lst:
x = lst.pop()
# do something with the element
一般に、(リストで行うような)状態の変異ではなく、より関数的なスタイルでプログラムを表現した方が、よりエレガントな表現ができることが多いようです。
関連
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] リストの要素を値で削除する簡単な方法はありますか?
-
[解決済み] Pythonでホームディレクトリを取得するための正しいクロスプラットフォームな方法は何ですか?
-
[解決済み] リストから最初の項目を削除するには?
-
[解決済み] リスト/タプルを指定されたインデックスにある要素でソートするには?
-
[解決済み] リストをチャンクで反復処理する最も "pythonic "な方法は何ですか?
-
[解決済み] 存在しないかもしれないファイルを削除するための最もpythonicな方法
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] if 節の終了方法
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法