如何创建所有唯一组合的列表,同时为每个组合保留总计列? 没有熊猫,但仍使用itertools.combinations和itertools.product

问题描述

我正在尝试寻找所有可能的独特组合来制作三明治。我也想知道每个三明治要花多少钱。我有3套两张清单,一份是物品清单,第二份是物品价格。

bread = ['italian','wheat','honey oat']
bprice = [1,2,3]
meat = ['roastbeef','ham','turkey','steak']
mprice = [3,1,4]
vegetable = ['lettuce','onions','tomatoes','pickles']
vprice = [1,4,3]

我正在尝试查找所有可能的唯一组合,但我也希望每个组合的总数。该组合应包含一种面包,一种肉和两种不同的蔬菜。例如:

输出:

          Combinations                Total
italian,ham,onions,pickles           9
italian,turkey,pickles       ...
wheat,pickles            ...

我完全不知道该怎么做。我研究了itertools.product,但这似乎只是组合而不是总数。我还考虑过建立索引以获取商品的价格,但同样也不知道如何将其与组合列表以及字典相结合,但不确定如何将其与所有组合列表相结合。有什么想法我该怎么做吗?

解决方法

我认为您可以这样做:

import pandas as pd #To display the results
from itertools import combinations,product

# Create bread dictionary 
bread = ['italian','wheat','honey oat']
bprice = [1,2,3]
breaddict = dict(zip(bread,bprice))

# Create meat dictionary
meat = ['roastbeef','ham','turkey','steak']
mprice = [3,1,4]
meatdict= dict(zip(meat,mprice))

# Create veggie dictionary
vegetable = ['lettuce','onions','tomatoes','pickles']
vprice = [1,4,3]
vegdict=dict(zip(vegetable,vprice))

# The real work is done here
# Create combinations of two veggies
# Then use that combination with bread and meat to calculate a product of sandwiches
sandwiches = product(bread,meat,combinations(vegetable,2))

# Create empty dataframe for storage and display
df=pd.DataFrame()

# Iterate through sandwiches 
# and use unpacking tuple and map with dictionary to populate dataframe
for b,m,v in sandwiches:
    df=df.append(pd.concat([pd.Series(','.join([b,*v])).rename('Combinations'),pd.Series(sum([breaddict[b],meatdict[m],*map(vegdict.get,v)])).rename('Total')],axis=1))
print(df)

输出:

                             Combinations  Total
0     italian,roastbeef,lettuce,onions      9
1   italian,tomatoes      7
2    italian,pickles      8
3    italian,onions,tomatoes     10
4     italian,pickles     11
..                                    ...    ...
67    honey oat,steak,tomatoes     10
68     honey oat,pickles     11
69     honey oat,tomatoes     13
70      honey oat,pickles     14
71    honey oat,tomatoes,pickles     12

[72 rows x 2 columns]

没有熊猫,但仍使用itertools.combinations和itertools.product

from itertools import combinations,product

bread = ['italian',2))

sandwiches_with_price = [[b,*v],sum([breaddict[b],v)])) for b,v in sandwiches]
sandwiches_with_price

输出:

[(['italian','roastbeef','lettuce','onions'],9),(['italian','tomatoes'],7),'pickles'],8),10),11),5),6),'steak',12),(['wheat',13),(['honey oat',14),12)]
,

我想每个三明治有2种蔬菜,1种肉和1种面包。

bread = ['italian',3]
meat = ['roastbeef',4]
vegetable = ['lettuce',3]

# prices are easier to manage in a dict,let's do that.
prices = {x:y for x,y in zip(bread,bprice)}
prices.update({x:y for x,y in zip(meat,mprice)})
prices.update({x:y for x,y in zip(vegetable,vprice)})


#now let's make all the vegetable combinations:
combveg = [ sorted((x,y)) for x in vegetable for y in vegetable if len(set([x,y])) == 2 ]

# remove duplicates
combveg = list(set([tuple(x) for x in combveg]))

# now calculate all the sandwich possibilities
sandwiches = [[b,m] + list(vgs) for b in bread for m in meat for vgs in combveg]

# just have to build their prices now
sandwiches_with_price = [(sandwich,sum([prices[item] for item in sandwich])) for sandwich in sandwiches]

大多数列表操作可以使用某些生成器表达式进行链接或优化,但目的是解释每个步骤。

,

另一种纯Python解决方案。

from operator import itemgetter
from itertools import product,combinations

bread = ['italian',3]

d = dict()
d.update(zip(bread,bprice))
d.update(zip(meat,mprice))
d.update(zip(vegetable,vprice))

for p in product(bread,2)):
    # make 1 tuple from list and tuple (from combinations)
    p = p[0:2] + p[2]
    print('{:<40} = {}'.format(','.join(p),sum(itemgetter(*p)(d))))

它使用项目(由Scott Boston使用)的产品

此外,它还有一个词典 slice

itemgetter(*p)(d))

这会从字典 d 中获取(面包,肉,蔬菜产品 p 的价格)

以下代码行:

p = p[0:2] + p[2]

这很骇人,但我不知道将combinations(vegetable,2)生成的元组而不是它生成的元组变成单一项目的另一种方法。

打印:

italian,onions      = 9
italian,tomatoes    = 7
italian,pickles     = 8
italian,tomatoes     = 10
italian,pickles      = 11
italian,pickles    = 9
italian,ham,onions            = 7
. . .
honey oat,tomatoes      = 10
honey oat,pickles       = 11
honey oat,tomatoes       = 13
honey oat,pickles        = 14
honey oat,pickles      = 12

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...