如何解决如何创建所有唯一组合的列表,同时为每个组合保留总计列? 没有熊猫,但仍使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。