9839


私はリストの中からランダムに一つの要素を取り出して代入するコードを以下のように書きました

[code]

    name = farm[randint(0,randint(0,len(farm)))]
    
[/code]

リストは最初は空で、あとから要素を追加していくと言うものです。

しかし、  
IndexError: list index out of range  
と出てしまいます。  
どのようにかけばエラーを避けられるでしょうか  
よろしくお願いします。


CC BY-SA 3.0
2015-05-05T07:57:30.743
9836
2015-05-11T07:19:53.777
9597
question
python
リストの中からランダムに一つの要素を選択したい場合はどうすればよいでしょうか（python）


いくつか問題があると思います．

  * 空リストのランダムな要素を取り出す時にどういう結果を期待しているのでしょうか．今のコードでは空リストに対してインデックスでアクセスしているので `IndexError` が出るでしょう．どうも Python で関数としてこれを提供するものはないようで（[python - Why list doesn't have safe "get" method like dictionary?](https://stackoverflow.com/questions/5125619)）， try-catch するか，事前に空かどうかのテストをし，よしなに処理をするのがいいと思います．
  * `random.randint` が入れ子で使われているのは意図があってのことでしょうか．単にランダムにひとつ選ぶなら一重で大丈夫そうに見えます．
  * また，このコードでは空でないリストに対しても`IndexError` が出る可能性があり，これは [`random.randint(a,b)` が a ≤ i ≤ b なる `i` を返す](https://docs.python.org/3.4/library/random.html#random.randint)からです．この場合でいえば `len(farm)` が返る場合があり，その時には `farm[len(farm)]` にアクセスが試みられて IndexError が出ます．この用途としては `random.randrange` を使うのがよいでしょうが，そもそもリストのランダムな要素にアクセスする場合は [`random.choice`](https://docs.python.org/3.4/library/random.html#random.choice) か [`random.sample`](https://docs.python.org/3.4/library/random.html#random.sample) が適任かと思います．


CC BY-SA 3.0
2015-05-05T09:47:07.387
9839
2015-05-05T09:47:07.387
2017-05-23T12:38:56.083
-1
2901
9836
answer


@Yoshがいったように、これには、`random.sample(population,
k)`や`random.choice(population)`が便利です。

  * `random.sample()`は、リストからkサンプル数を返してくれます。
  * `random.choice()`は、リストから、ひとつだけのサンプルを返してくれます。

使い方の例：

[code]

    import random
    
    farm = [ "a", "b", "c", "d"]
    one_sample = random.choice(farm)
    two_samples = random.sample(farm, 2)
    
[/code]

結果：

[code]

    >>> one_sample
    'b'
    
    >>> two_samples
    ['c', 'a']
    
[/code]

ちなみに、[`random.suffle()`](https://docs.python.org/3.4/library/random.html#random.shuffle)を使って、同じことができます

  * `random.suffle(x)`は、シーケンス x をインプレースにによって混ぜます。

例：

[code]

    import random
    
    farm = [ "a", "b", "c", "d"]
    
    random.suffle(farm)
    # 一つのサンプル
    one_sample = farm[0]
    two_samples = farm[:2]
    
[/code]


CC BY-SA 3.0
2015-05-11T00:45:49.623
10014
2015-05-11T07:19:53.777
2015-05-11T07:19:53.777
2314
2314
9836
answer