我有一个列表(实际上是一个可迭代的),它是使用python的itertools库的这个函数创建的:
comb = [c for i in range(len(menu)+1) for c in combinations(menu, i)]
给你一个想法menu
是这种格式的列表[[“食物名称”,糖的克数]]:
menu = [ ["cheesecake", 13], ["pudding", 24], ["bread", 13], .........]
所以comb
本质上是一个列表,其中包含菜单子列表的所有可能组合。我必须迭代梳理创建所有可能的项目组合,其总糖含量将完全相等(不少,不多,完全)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 "
答案 0 :(得分:1)
正如您所暗示的那样,您可以使用列表推导来遍历所有菜单组合,并将其限制为那些meals
,其中包含您正在寻找的糖量:
>>> # 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']]
答案 1 :(得分:0)
e
中的每个项目comb
都是列表元组,例如:
e == (['cheesecake', 13], ['bread', 13])
因此l
中的每个项e
都是一个列表:
l == ['cheesecake', 13]
对于此列表,字符串cheesecake
为l[0]
,整数13
为l[1]
。因此,您可能想要:
for e in comb:
if sum(l[1] for l in e) == max_sugar:
print([l[0] for l in e])
正如wim
建议的那样,您也可以使用“解包”将每个列表拆分为合理的名称,这样可以使代码更清晰:
for e in comb:
if sum(sugar for name, sugar in e) == max_sugar:
print([name for name, sugar in e])
对于您提供的简短menu
列表以及max_sugar == 26
,我得到:
['cheesecake', 'bread']
或max_sugar == 37
:
['cheesecake', 'pudding']
['pudding', 'bread']