2016-11-23 10 views
-1

辞書と辞書のリストがあり、そのリストの項目を辞書の2つのキーのいずれかに割り当てる必要があります。辞書の両方のキーには値が割り当てられていなければならず、項目は各辞書に複数回表示されず、各項目の分散が均衡する必要があります。辞書キーに項目を均等に割り当てる

私は果物を使用するつもりです:

fruits = ['apple', 'orange', 'banana', 'papaya', 'kiwi'] 
baskets = [{'basket': 'one', 'fruit1': '', 'fruit2': ''}, 
      {'basket': 'two', 'fruit1': '', 'fruit2': ''}, 
      {'basket': 'three', 'fruit1': '', 'fruit2': ''}, 
      {'basket': 'four', 'fruit1': '', 'fruit2': ''}] 

バスケットの数は問題ではないはず。

これは私が現時点でそれをやっている方法です:

import itertools 

def in_basket(frt, bskt): 
    if frt in bskt.values(): 
     return True 
    else: 
     return False 

g = itertools.cycle(fruits) 
fruit = next(g) 

for basket in baskets: 
    basket['fruit1'] = fruit 
     fruit = next(g) 

for basket in baskets: 
    while True: 
     if not in_basket(fruit, basket): 
      basket['fruit2'] = fruit 
      break 
     else: 
      fruit = next(g) 

このアプローチの問題は、私は果物の分布とのアンバランスを得るということです。バスケットがもっとたくさんあるかもしれません。

各バスケットスロットにフルーツの均一な分布を実現する方法はありますか?

編集 - 出力は更新された 'バスケット'リストであり、フルーツスロットがいっぱいです。

+0

あなたが言及したリストの必要な結果(サンプルリスト)は何ですか? –

+1

はい私は怠け者だと知っていますが、あなたの出力がどのように見えるかの例を挙げることができますか? –

+0

出力は単に更新された辞書のバスケットリストです。 – rafello

答えて

1

。唯一の注意点は、1つのバスケットで果物1が何であるかを知ると、果物2が自動的に決定されることです。あなたはそれを好きではない場合、あなたはそれぞれの可能な果物のために、次の果物を使用することができます。最初のバスケットのために

g = itertools.cycle(fruits) 
fruit_iter = {} 
for i, fruit in enumerate(fruits): 
    fruit_iter[fruit] = itertools.cycle(fruits[i+1:] + fruits[:i]) 
for basket in baskets: 
    fruit = next(g) 
    basket['fruit1'] = fruit 
    basket['fruit2'] = next(fruit_iter[fruit]) 

、各果実は、次が続いているfruitsために、しかし、すぐに1がfruit1として再利用されるように、対応するfruit2が次に表示されます。ここには全くランダムではありませんが、確率分布はすべて確率(発生率)

+0

これは実際にはかなり良いです。私はむしろもう少しランダムに出現したと思いますが、リスト内のバスケットの順番を混ぜ合わせてから、果物を割り振った後に再び整えていくことで、これを見せかけることができます。 – rafello

+1

@rafello:* nicer *ディストリビューションのための私の編集を参照してください... –

+0

これはいいです、バスケットの数が増加すると、すべてのバスケットにわたって果物の良いと均一な分布があります。ありがとう。 – rafello

1

質問はまだ分かりませんので、このコードは各バスケットにランダムな果実を一様に塗りつぶします。この弱点は、バスケット内の場所と同じくらい多くの果物の選択が必然的に必要であるということです。

g = itertools.cycle(fruits) 
for basket in baskets: 
    basket['fruit1'] = next(g) 
    basket['fruit2'] = next(g) 

分布が設計でバランス次のとおりです。単純なラウンドロビンを使用しないのはなぜ

import numpy as np 

for basket in baskets: 
    for k in basket: 
     if k!='basket': 

      new_fruit = '' 

      while new_fruit in list(basket.values()): 
       new_fruit = np.random.choice(fruits) 

      basket[k] = new_fruit 
+0

ありがとうございます。どの順序で果物のスロットが満たされているかは関係ありません。私がこのコードで持っている問題は、2つ、3つ、4つのバスケットのfruit2スロットが空であることです。 – rafello

+1

ああ、私は理解しています。他のユーザーが既に提案しているように、あなたの質問を編集してあなたの希望する出力をより具体的にすることをお勧めします。 – Leo

+1

@rafelloランダムサンプリングを使用する答えを更新しました。あなたがリストの順序を混乱させる必要はありません。 – Leo

関連する問題