将项平均分配给字典键

2024-09-28 17:15:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表和一个字典列表,我想把列表中的项目分配给字典中的两个键之一。字典中的两个键都必须指定值,每个字典中的项不应出现一次以上,并且每个项的分布应平衡。你知道吗

我要用水果:

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)

这种方法的问题是,我得到了一个水果分配不平衡。可能还有更多的篮子。你知道吗

有没有办法在每个篮子槽中实现水果的均匀分配?你知道吗

编辑-输出是更新的“篮子”列表,所有水果槽都已填满。你知道吗


Tags: in列表字典nextitertoolsfruit篮子fruits
2条回答

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

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])

对于第一个篮子,每个水果后面紧跟着下一个,但一旦其中一个被重新用作fruit1,相应的fruit2就会是下一个。这里绝对没有随机性,但分布覆盖了所有可能的情况,概率相当(发生率)

由于这个问题还不清楚,这个代码将统一地用一个随机的水果填充每个篮子。缺点是它需要至少和篮子里的位置一样多的水果选择。你知道吗

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

相关问题 更多 >