如何在 Python 中构造一个算法,用来自随机生成的过滤值填充列表?

问题描述 投票:0回答:1

我想创建一个包含 25 个项目的列表,所有项目都具有键/值对中的特定键,但我从 API 函数调用接收到的对本质上有些随机。我不确定填充列表的最有效方法是什么。

举这个随意的例子:

函数生成指定数量的随机动物,其名称作为键/值对,因此

getAnimals(3)

生成

{'Cat':'Ted'}
{'Horse': 'Fred'}
{'Bird': 'Jed}

因此,如果我想要一本包含 25 种动物(全是猫)的字典,则所需的结果将如下所示:

[
    {'Cat': 'Ted'}, 
    {'Cat': 'Aaron'}, 
    {'Cat': 'Fluffy'},
    ...
]

我知道一次生成一项绝对不理想。现在我的理论是,我应该一次生成 25 个项目,过滤掉非 cat 条目,然后再次调用该函数来填充剩余数量的点。重复直到字典已满。这是解决这个问题最有效的方法吗?如果没有,构建该算法的最佳方法是什么?

python algorithm dictionary random filter
1个回答
0
投票

将您的

getAnimals
函数模拟为生成器,在一键字典中生成物种和名称的随机选择:

import random

species = ['Cat','Dog','Bird','Cow','Frog']
names  = ['Ted','Aaron','Jed','Fluffy','Tom','Max']
def getAnimals(count):
    for _ in range(count):
        yield {random.choice(species):random.choice(names)}

运行示例:

print(*getAnimals(5),sep='\n')
{'Cat': 'Ted'}
{'Frog': 'Jed'}
{'Bird': 'Max'}
{'Frog': 'Fluffy'}
{'Dog': 'Max'}

您可以使用 while 循环来填充 25 只猫列表,该循环会询问结果列表中缺少的项目数:

result = []
while len(result)<25:
    for animal in getAnimals(25-len(result)):
        if 'Cat' in animal:
            result.append(animal)

print(result)

[{'Cat': 'Ted'}, {'Cat': 'Jed'}, {'Cat': 'Ted'}, {'Cat': 'Tom'}, 
 {'Cat': 'Tom'}, {'Cat': 'Ted'}, {'Cat': 'Max'}, {'Cat': 'Max'}, 
 {'Cat': 'Ted'}, {'Cat': 'Fluffy'}, {'Cat': 'Jed'}, {'Cat': 'Tom'}, 
 {'Cat': 'Ted'}, {'Cat': 'Aaron'}, {'Cat': 'Max'}, {'Cat': 'Aaron'}, 
 {'Cat': 'Tom'}, {'Cat': 'Tom'}, {'Cat': 'Max'}, {'Cat': 'Jed'}, 
 {'Cat': 'Aaron'}, {'Cat': 'Ted'}, {'Cat': 'Tom'}, {'Cat': 'Tom'}, 
 {'Cat': 'Aaron'}]

如果生成较大批次有好处(例如,如果您从网络服务或数据库获取此数据),则可以从估计计数开始,并根据迄今为止发现的 Cats 比率在每次迭代中细化估计:

target    = 25
result    = []
generated = 0
estimate  = target
while len(result)<target:
    estimate = (target-len(result))*generated/max(1,len(result)) or target
    for animal in getAnimals(round(estimate)):
        generated += 1
        if 'Cat' in animal:
            result.append(animal)
            if len(result) == target:
                break
© www.soinside.com 2019 - 2024. All rights reserved.