gpt4 book ai didi

python - 有条件地迭代对象的组合

转载 作者:行者123 更新时间:2023-12-01 00:35:56 24 4
gpt4 key购买 nike

我正在制定一个小型营养计划,希望找到某些食物的最佳组合,以满足卡路里和大量营养素方面的一些要求。就这个问题而言,我将只关注目标卡路里。

我有来自 API 的数据,这些数据可以告诉我有关给定食物的信息。例如:

egg = Food(FOOD_IDS["Boiled Egg"])
print(egg.macros.__dict__)

结果:

{'protein_grams': 6.0, 'fat_grams': 4.5, 'carb_grams': 1.0, 'calories': 68.5}

我正在尝试做的是找到我可用的食物的可能组合,这些组合将加起来达到目标​​卡路里数。

所以,如果我在食物集合中有鸡蛋大米鸡肉,我怎样才能找到这些食物的所有可能组合,总和例如3000卡路里?

我正在考虑使用randomwhile循环中不断收集食物,直到达到卡路里目标,但随着我的食物 list 的增加,我担心性能。我之前使用过 itertools 库中的 productcombinationspermutations,但我没有看到由于我打算在边界条件内迭代,因此如何在这里应用这些方法。

这是我迄今为止的尝试:

def get_daily_food_options(self):
target = 3000
food_combinations = []
groceries = []
groceries.append(Food(FOOD_IDS["Boiled Egg"]))
groceries.append(Food(FOOD_IDS["Brown Rice"]))
groceries.append(Food(FOOD_IDS["Chicken Breast"]))
num_iterations = 100 # I have to manually change this to get more/less results
for i in range(num_iterations):
temp_combination = []
current_calories = 0
while current_calories < target:
food = choice(groceries) # random (not smart)
temp_combination.append(food)
current_calories += food.macros.calories
food_combinations.append(temp_combination)
return food_combinations

这可行...但是有更聪明的方法吗?

为了简单起见,您可以使用这些 int 卡路里值进行测试:鸡蛋=68.5大米 = 169.5鸡=114.5

这是我的程序的一些示例输出,以展示我如何消化结果:

Mixed Nuts (28.0g per serving) : 3 servings
Good Seed bread (28.0g per serving) : 2 servings
Brown Rice (45.0g per serving) : 1 servings
Pineapple (77.0g per serving) : 5 servings
Sweet Potato (120.0g per serving) : 4 servings
Boiled Egg (45.0g per serving) : 2 servings
Green Peas (89.0g per serving) : 5 servings
Salmon (113.0g per serving) : 7 servings
Chicken Breast (112.0g per serving) : 3 servings
Spinach (85.0g per serving) : 1 servings

最佳答案

以下程序获取总卡路里计数和代表各个食物的卡路里含量的整数列表。它试图找到这些食品的倍数,这些食品将恰好加起来达到所需的总卡路里数:

from itertools import product

def get_combinations(total_calories, calorie_counts):
n = len(calorie_counts)
max_factors = [total_calories // calorie_counts[i] for i in range(n)]
for t in product(*(range(factors + 1) for factors in max_factors)):
calorie_count = sum([t[i] * calorie_counts[i] for i in range(n)])
if calorie_count == total_calories:
print(t)


get_combinations(3000, [300, 150, 200])

如果您坚持每种食物至少一份,则将 for 循环更改为:

for t in product(*(range(1, factors + 1) for factors in max_factors)):

这个想法是,如果总卡路里为 X,而某种食物为 Y 卡路里,则该食物唯一可能的份数在 [0..X//Y](或 [1.. X//Y]如果您坚持至少有一份)。因此,如果有 N 个食物,程序会通过生成长度为 N 的元组来对所有可能的食物组合进行详尽的试验,其中每个元组都是一种可能的尝试组合。

See demo

关于python - 有条件地迭代对象的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57762814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com