python - 如何在字符串/整数列表中仅选择整数?

标签 python list iterator list-comprehension

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

相关文章:

python - 如何使用 scipy.optimize.minimize

python - 为什么这会发生在 Python 中?它与列表可变性有关吗?

python - 如何使用 NLTK(pos 标记)获取动词的不定式形式

java - 类型不匹配错误 : Cannont convert from ArrayList<SubClass1> to List<SuperClass>

list - 在 Prolog 中实现 "last"

javascript - 在 Javascript 中制作并行的复选框列表

java - 在 Java 中使用 "@SuppressWarnings("unchecked")"有什么好处?

python - 重命名数据框列表中的列?

c++ - 我可以在环中实现迭代器 end() 吗?

java - 迭代器越界