我有一个列表和一个词典列表,我想将列表中的项目分配给词典中的两个键之一。字典中的两个键都必须分配值,每个字典中不应出现多个项目,并且应平衡每个项目的分布。
我要用水果:
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)
由于问题仍然不明确,因此该代码将使用随机水果统一填充每个篮子。缺点是必须至少需要与篮子中的位置一样多的水果选择。
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
将成为下一个。这里绝对没有随机,但是分布涵盖所有可能的情况,具有等效的概率(出现的百分比)