2016-11-23 36 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