私がすぐに考えることができる2つのアプローチ:
- 最初にリスト名(キー)を選択し、次にその中からエントリを選択します。均一な分布が必要な場合は、リストの長さが異なる場合は注意が必要です。
- リストの辞書をペアの1つのリストにフラット化します
('list-name','value')
(リストごとにエントリがいくつあっても、一様分布を正しく取得するのは簡単ですが、より多くのメモリが必要です)
前者を行う1つの方法:
from itertools import chain
import random
weight_choices = list(chain(*([name] * len(values) for (name, values) in lists.iteritems()))) # generate a list of the form ("animals", "animals", "animals", ...)
list_name = random.choice(weight_choice) # The list it's chosen from...
chosen_item = random.choice(lists[list_name]) # and the item itself
(そして、リスト間で均一に分散することを気にしない場合:)
import random
list_name = random.choice(lists.keys())
chosen_item = random.choice(lists[list_name])
...そして後者の方法:
from itertools import chain, repeat
all_items = list(chain(*((zip(repeat(name), values) for (name, values) in lists.iteritems()))))
list_name, chosen_item = random.choice(all_items)
後者の場合は、より少ないitertools
方法です。
all_items = []
for name, values in lists.iteritems():
for value in values:
all_items.append((name, value))
list_name, chosen_item = random.choice(all_items)