如何只选择字符串/整数列表中的整数?

时间:2014-01-29 16:54:52

标签: python list iterator list-comprehension

我有一个列表(实际上是一个可迭代的),它是使用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 " 

2 个答案:

答案 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]

对于此列表,字符串cheesecakel[0],整数13l[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']