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

如何解决如何创建所有唯一组合的列表,同时为每个组合保留总计列? 没有熊猫,但仍使用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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-