2016-11-23 17 views
-1

我有一個列表和一個詞典列表,我想從列表中分配項目到詞典中的兩個鍵之一。字典中的兩個鍵必須分配值,每個字典中不應出現多次,每個項目的分佈應平衡。均勻地分配項目到詞典鍵

我打算用水果:

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

爲什麼不使用一個簡單的循環:

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

的分佈是均衡設計。唯一需要注意的是,一旦你知道一個籃子裏的水果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順序,但只要一會fruit1被重用,相應的fruit2將是下一個。這裏絕對不是隨機的,但分佈涵蓋所有可能的情況,具有相當的概率(發生百分比)

+0

這其實很不錯。我寧願它'出現'更隨機一些,但我想我可以通過混合列表中的籃子順序,然後在分配果實後重新調整它。 – rafello

+1

@rafello:看到我編輯的*更好的*分佈... –

+0

這是很好的,當籃筐的數量增加時,所有籃筐都有良好的均勻分佈的水果。謝謝。 – rafello

1

由於問題仍然不清楚,所以這段代碼會隨機填充每個籃子。弱點在於它必須至少需要與籃子中的位置一樣多的水果選擇。

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