我可以立即想到的两种方法:
- 首先选择一个列表名称(键),然后从中选择一个条目——如果列表有不同的长度,如果你想要均匀分布,你只需要小心
- 将列表的字典展平为一个对列表
('list-name','value')
(无论每个列表有多少条目,都更容易获得均匀分布,但需要更多内存)
做前者的一种方法:
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)