我有一个列表(实际上是一个可迭代的),它是使用 python 的 itertools 库的这个函数创建的:
comb = [c for i in range(len(menu)+1) for c in combinations(menu, i)]
给你一个想法菜单
是一个这种格式的列表[[“食物名称”,糖克数]]:
menu = [ ["cheesecake", 13], ["pudding", 24], ["bread", 13], .........]
所以comb
本质上是一个包含菜单子(monad)列表所有可能组合的列表。我必须通过梳子迭代创建所有可能的项目组合,其总糖含量将完全等于(不是更少,不是更多,完全)max_sugar = 120
。
所以我想我可以迭代comb
中的每个可能的组合,并使用if
语句检查该组合中项目的糖总和是否完全等于max_sugar
。如果是这种情况,我想输出此组合中的菜单项的名称。否则我想以这种方式继续进行其他组合:
for e in comb:
for l in e:
if sum(sugars of items in this combination) == max_sugar: # pseudo-code
print items in this combination #pseudo code
我想我遇到的问题是仅访问l
中每个项目的糖值并检查条件,如果为TRUE
则打印名称。
我不精通 python 列表理解,但在过去的几天里我已经进步了很多!
flag = 0
num_comb = 1
comb = [c for i in range(len(menu)+1) for c in combinations(menu, i)]
for e in comb:
if sum(l[1] for l in e) == targetSugar:
print "The combination number " + str(num_comb) + " is:\n"
print([l[0] for l in e])
print "\n\n\n"
num_comb += 1
flag = 1
if flag == 0:
print "there are no combinations of dishes for your sugar intake... Sorry! :D "
最佳答案
正如您所提到的,您可以使用列表理解来迭代所有菜单组合,并限制为那些含有您正在寻找的糖量的餐食
:
>>> # input data
>>> menu = [ ["cheesecake", 13], ["pudding", 24], ["bread", 13] ]
>>> max_sugar = 26
>>> # construct all combinations of menu items
>>> comb = [c for i in range(1, len(menu)+1) for c in combinations(menu, i)]
>>> list(comb)
[(['cheesecake', 13],), (['pudding', 24],), (['bread', 13],), (['cheesecake', 13], ['pudding', 24]), (['cheesecake', 13], ['bread', 13]), (['pudding', 24], ['bread', 13]), (['cheesecake', 13], ['pudding', 24], ['bread', 13])]
>>> # restrict to meals with exactly max_sugar
>>> meals = [ e for e in comb if sum( sugar for _, sugar in e) == max_sugar ]
>>> meals
[(['cheesecake', 13], ['bread', 13])]
唯一棘手的部分是,当您迭代每个组合时,每个元素 e
都是一个包含名称和糖数的列表。因此,您可以使用以下方法测量组合e
中的糖含量:
sum( sugar for _, sugar in e) == max_sugar
在此基础上,如果您只想返回每顿饭中食物的名称,您可以使用:
>>> [ [name for name, sugar in m] for m in meals ]
[['cheesecake', 'bread']]
关于python - 如何在字符串/整数列表中仅选择整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21437511/