2014-01-29 4 views
1

У меня есть список (на самом деле итератор), который был создан с помощью этой функции библиотеки 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

Каждый из элементов 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'] 
+1

Очиститель для использования распаковки, т.е. 'для названия, сахара в e' – wim

+0

Это хороший момент, спасибо; редактирование – jonrsharpe

+0

Спасибо вам за помощь! Теперь имеет большой смысл! – user3245453

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']] 
+0

На самом деле я хочу по существу проверить каждую возможную еду, если сумма сахара всех предметов в этом еде равна ТОЧНО 'max_sugar'. Надеюсь, это имеет смысл. Потому что я хочу выпустить все возможные блюда (может состоять из 1, 2 или 3 или ... пунктов, если сумма их сахара равна ТОЧНО 'max_sugar'. Поэтому после создания всех возможных комбинаций блюд я в значительной степени пытаюсь отфильтровать те, которые удовлетворяют моему состоянию и пытаются вывести имена только из элементов в каждом из этих приемов – user3245453

+0

@ user3245453: код, который я продемонстрировал, находит все комбинации пунктов меню с ТОЧНО 'max_sugar'. Затем вы можете вывести имена каждого пункта меню для каждого из этих «блюд», используя фрагмент кода в конце моего ответа. – mdml

Смежные вопросы