2

私はリストの辞書を持っています:

lists=dict(animals=["dog","cat","shark"],
           things=["desk","chair","pencil"],
           food=["spaghetti","ice-cream","potatoes"])

Pythonにリストの1つからランダムにアイテムを選択させ、それがどのリストに含まれていたかを教えてもらうにはどうすればよいですか?または、辞書からキーを選択し、次にそのキーに対応するリストから値を選択するにはどうすればよいですか?

例えば:

 
犬-動物から
ジャガイモ-食品から
4

2 に答える 2

4

random.choiceシーケンスからランダムなアイテムを選択します。

import random

dict名前を付けた、から描画するキーを選択しますlists

which_list = random.choice(lists.keys())

次に、そのキーを使用して:listからを取得します。dict

item = random.choice(lists[which_list])

等しい重み付けが必要な場合:

import random

which_list, item = random.choice([(name, value) 
                                     for name, values in lists.iteritems() 
                                         for value in values])
于 2012-04-12T22:05:19.990 に答える
3

私がすぐに考えることができる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)
于 2012-04-12T22:10:37.397 に答える