random.choice
インデックス作成をサポートする任意のシーケンスで機能します。
>>> random.choice("foobar") #string
'o'
>>> random.choice(("foo","bar","spam")) #tuple
'spam'
>>> random.choice(["foo","bar","spam"]) #list
'spam'
セットでは機能しません:
>>> random.choice({"foo","bar","spam"})
Traceback (most recent call last):
File "<ipython-input-313-e97c3088a7ef>", line 1, in <module>
random.choice({"foo","bar","spam"})
File "/usr/lib/python2.7/random.py", line 274, in choice
return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty
TypeError: 'set' object does not support indexing
ではrandom.choice("hearts" , "clubs", "frogs")
、実際には に 3 つの引数を渡しましたがchoice
、 は 1 つのパラメーターのみをrandom.choice
想定しており、それもインデックス作成をサポートする必要があります。
しかしrandom.choice
、dict に数値キー (0 から len(dict)-1 の間) がある場合、dict で機能します。内部的には次のようになります。
dic[int(random() * len(seq))]
例:
>>> dic = dict(zip([1, 2, 3, 4, 5, 6], "abcdef"))
>>> random.choice(dic)
'b'
>>> random.choice(dic)
'd'
>>> random.choice(dic)
'd'
>>> random.choice(dic) #fails as 0 was not found in dic
Traceback (most recent call last):
File "<ipython-input-366-5cfa0e5f2911>", line 1, in <module>
random.choice(dic)
File "/usr/lib/python2.7/random.py", line 274, in choice
return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty
KeyError: 0