2017-07-14 7 views
1

が含まれていないリストからランダムインデックスを生成:私はランダムに異なる要素を選択し、その上にいくつかの操作を実行する必要があり、このリストの各要素についてl = [1,2,3,4]私は整数のリストを持っている一つの特定のインデックス

を:

for i in range(len(l)): 
    idx = # a random index which is NOT equal to i 
    # do something with the element at idx 

私はまだPythonのにかなり新たなんだと私はランダムなインデックスを生成し、乱数である場合のみ、ループを停止ループに頼ることなくこれを行う方法があるかどうかを決定することはできませんiと等しくない。どんな提案も大歓迎です。 0N - 1との間の乱数を生成し(Nこの場合のリストの長さである)、それはi以上であれば、その数に1を追加します。これについて

+0

あなたがここに役立つでしょう:何私_exactly_あるhttps://stackoverflow.com/questions/25200220/generate-a-random-derangement-of-a-list – WNG

答えて

4

方法。

この方法で、すべての数字はiの上に巻か "1アップ" にシフトされています

 0  i   N 
before ***************** 
after ******* ********** 

あるいは、単一のラインで、あなたは i + 1間の数を生成することがありましたがN + iとなり、その数値をモジュロNとし、リストの最後の後に効果的に包みます:

012使用

1)下限と上限を除くを含むここでの意味、randrange

+0

はい、私が探していたものです@tobias_k。私がそれを許すとすぐに私はそれを受け入れます。 – RobertJoseph

+0

なぜかだけではない idx = idx + 1ならidx == i else idx? – Alexey

+1

@Alexey "高い" idxをシフトする必要があります。それ以外の場合、i + 1の確率は2倍高くなり、len(l)-1は決してロールアップされません。私の編集を参照してください。しかし、idx == i else idxならば、あなたは 'idx = len(l)-1を実行できます。 –

-1
import random 

l = [1, 2, 3, 4] 

for x in l: 
    new_el = random.choice(l) 
    while new_el == x: 
     new_el = random.choice(l) 
    print new_el 
+0

私の質問@アレクシーで説明します。私はそれ以外の何かを探しています。私はNumPyなどがこれを行うことができると期待していた。 – RobertJoseph

1
l=[1,2,3,4,5] 
import random as rd 
def remove_index(list,index): 
    res=list[:] 
    res.pop(index) 
    return res 

for i in range(len(l)): 
    print rd.choice(remove_index(l,i)) 
+0

各繰り返しでリストの_フルコピーを作成しますか?私のリストが何百万ものアイテムであればどうなるでしょうか? – RobertJoseph

+0

私はそれがちょっと非効率だと思います。私は実際にはPythonには新しいので、私はPythonの構文での練習としてそれを取った。 –

+0

さて、tobias_kの解を見てください。そのためには追加のメモリと1つの余分な比較が必要です。 – RobertJoseph

0

ショートnumpyアプローチ:

import numpy as np 

l = np.array([1,2,3,4]) 
for i in range(len(l)): 
    idx = random.choice(np.where(l != l[i])[0]) 
    # do stuff with idx 
    print(i, idx) 

出力(表示率差) :

0 1 
1 2 
2 3 
3 1 
+0

リストに重複した要素が含まれていて(同じ要素が別の位置にある限りピックすることができると仮定した場合) –

+1

@tobias_k、*重複する要素*について誰も触れておらず、OPは異なるインデックスについて書きました。 *重複する要素*について書くのはなぜですか? – RomanPerekhrest

+1

重複した要素は誰も言及していませんが、それは問題ではありません。 OPは現行の索引以外のランダムな索引を要求しましたが、現行の要素またはその重複を持つ索引以外の任意の索引を生成します。 –

0

別のアプローチ:

size = len(l) 
idxl = [random.choice([j for j in range(size) if j != i]) for i in range(size)] 

for idx in idxl: 
    # do something with the element at idx 
関連する問題