将项目均匀分配给字典键

时间:2016-11-23 18:16:46

标签: python python-3.x dictionary itertools

我有一个列表和一个词典列表,我想将列表中的项目分配给词典中的两个键之一。字典中的两个键都必须分配值,每个字典中不应出现多个项目,并且应平衡每个项目的分布。

我要用水果:

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)

这种方法的问题在于我对水果的分布存在不平衡。可能会有更多的篮子。

有没有办法在每个篮子槽中实现水果的均匀分布?

修改 - 输出是已更新的“购物篮”列表,其中包含所有水果广告位。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

为什么不使用简单的循环法:

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

分布是按设计平衡。唯一需要注意的是,一旦你知道一个篮子里的fruit1是什么,就会自动确定fruit2。如果你不喜欢它,你可以为每种可能的水果使用下一种水果:

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将成为下一个。这里绝对没有随机,但是分布涵盖所有可能的情况,具有等效的概率(出现的百分比)