大佬们求问一下 我有一个需求 Python 能实现吗?

2020-07-09 16:41:52 +08:00
 L4Liiyooooo
如我有这么一个表 行为 a,b,c,d,e 列为 A,B,C,D,E 内容都是数字
我想使行 a,b,c,d,e 任意(随意,随机)组合做相加 满足比如 A>1,B>2,C>3,D<4,E<5 的几个条件 或者列出所有满足条件的组合 可以使用 python 设计一个简单的程序吗?有没什么书籍或者视频可以参考的?
3325 次点击
所在节点    Python
22 条回复
laike9m
2020-07-09 16:45:07 +08:00
和 Python 有啥关系?难道不写 SQL 么
laike9m
2020-07-09 16:47:10 +08:00
好吧当我没说。建议把输入和想要的输出写清楚,这样才好回答
gwy15
2020-07-09 16:53:52 +08:00
没看懂你定义的“随意随机”是什么意思,我描述下我的理解。

矩阵 A_ij 是 5x5 的矩阵,选出其中若干行,将行向量相加,得到 a,要求 a_0 > 1, a_1 > 2, etc.

如果是每行 01 选择的话直接位运算就行,2^5 复杂度;
如果是每行都可以若干次选择(线性组合),那就解五元线性不等式就行了,找本优化方面的书看。
L4Liiyooooo
2020-07-09 17:00:23 +08:00
@laike9m 我不懂。。。 我想着实现一个简单的程序 所以觉得应该要用 python 如果 sql 可以实现的话也可以的 只要能实现 用啥都行。。。 抱歉刚才不会发图片 我以为不能发
这个表格
L4Liiyooooo
2020-07-09 17:06:55 +08:00
@gwy15 比如 a+b+c 或者 a+b+e 同时满足条件 因为我想一次输出一个结果 所以说随意,随机
大佬你这方法对我来说有点困难了 我看不懂。。。 如果需要这么难的话 我还是暂时先放弃了。。。
Yourshell
2020-07-09 17:28:50 +08:00
搜索 subset sum
MOONLIGHTT
2020-07-09 17:34:17 +08:00
pandas 或者 numpy
Counter
2020-07-09 17:42:02 +08:00
我很想帮你,但是实在不懂你在说什么,谁理解了说下
jstony
2020-07-09 17:42:58 +08:00
这还要 python,太杀鸡用牛刀了吧,excel 的筛选不好用吗
aloxaf
2020-07-09 17:44:47 +08:00
直接用现成的 SAT Solver 即可,比如 z3

https://fars.ee/rJgx/py
AX5N
2020-07-09 17:57:48 +08:00
我猜楼主是这个意思
```
for i in list:
if list[0] > 1 and list[1] > 2 and list[2] > 3 and list[3] > 4 and list[4]>5:
print (i)
```
AX5N
2020-07-09 17:58:26 +08:00
@AX5N 打错,应该是 if i[0]...................
nuistzhou
2020-07-09 18:05:52 +08:00
我猜楼主随机的意思是从所有“行”里挑出满足这些“列”条件的。这玩意 SQL 或者 Pandas 很快解决的
L4Liiyooooo
2020-07-09 18:29:25 +08:00
@jstony 一开始我是想设计一个可以随机输出一个满足条件的组合的程序。。。
L4Liiyooooo
2020-07-09 18:38:59 +08:00
@Counter 谢谢

这是我编辑的一个示例 就是 A,B,C,D,E 都有一个标准值(肯定大于单独一行的数值)
然后任意行相加 大于或等于标准值 即为一种组合 比如 a+b,a+c+d 等等
我想找出所有的组合
aloxaf
2020-07-09 18:45:23 +08:00
只出现一次的话,直接穷举不就行了。。。
flamehaze
2020-07-09 19:02:20 +08:00
没太看懂,但是我隐约觉得 excel 自带的功能就能完成,excel 里也能编程的。
volvo007
2020-07-09 20:48:40 +08:00
楼主的条件是,任意行相加大于标准值就可以
但是楼主想过没有,你现在有 200 行……要打印出所有的组合你算过有多少种吗……说得轻巧啊……最坏情况可是 200 ! 200 的阶乘啊……

我建议你找到一个满足条件的就收手,全打印出来太天真了

如果是随机提供行数,你这里 0-200 行选哪些行不确定,200 行里面每次选多少行出来也不确定,不过用两次随机数就可以了。用 np.random.randint(200) 可以生成一个 200 内的随机整数 N 作为需要相加的行数,用 np.random.choice(range(200), N) 就可以从 200 行当中不重复选出这随机的 N 行

然后得到的行数是一个数组,可以用 df.iloc[ list, :].sum(axis=0) 算出这些随机行的每一列的和

之后和你的标准值比较就可以了

这个过程可以循环多次。我估计不到一秒就能找到其中的一个组合。你要把组合全打印出来我真劝你放弃……
L4Liiyooooo
2020-07-09 21:11:52 +08:00
@volvo007 看明白了 是这么个事啊 厉害厉害 受教了! 感谢感谢!
L4Liiyooooo
2020-07-09 21:17:29 +08:00
@volvo007 选哪些行都行 选多少行相加也可以 只要满足条件即可 我自己都没描述清楚!你帮我说清楚了 感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/688604

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX