我想创建一个包含 25 个项目的列表,所有项目都具有键/值对中的特定键,但我从 API 函数调用接收到的对本质上有些随机。我不确定填充列表的最有效方法是什么。
举这个随意的例子:
函数生成指定数量的随机动物,其名称作为键/值对,因此
getAnimals(3)
生成
{'Cat':'Ted'}
{'Horse': 'Fred'}
{'Bird': 'Jed}
因此,如果我想要一本包含 25 种动物(全是猫)的字典,则所需的结果将如下所示:
[
{'Cat': 'Ted'},
{'Cat': 'Aaron'},
{'Cat': 'Fluffy'},
...
]
我知道一次生成一项绝对不理想。现在我的理论是,我应该一次生成 25 个项目,过滤掉非 cat 条目,然后再次调用该函数来填充剩余数量的点。重复直到字典已满。这是解决这个问题最有效的方法吗?如果没有,构建该算法的最佳方法是什么?
将您的
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