大佬们求问一下 我有一个需求 Python 能实现吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
L4Liiyooooo
V2EX    Python

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

  •  
  •   L4Liiyooooo 2020-07-09 16:41:52 +08:00 3889 次点击
    这是一个创建于 1926 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如我有这么一个表 行为 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 设计一个简单的程序吗?有没什么书籍或者视频可以参考的?
    第 1 条附言    2020-07-09 18:26:48 +08:00
    感谢老哥们的回复 是我没说清楚

    这是我一个举例 原始数据量也不大 大概 15 列 200 行左右
    A,B,C,D,E 都有一个标准值且都大于任何一行的数值
    我想找出所有 行数值相加大于标准值的 组合
    比如 a+b+c 满足 或者 a+d 满足
    一开始我是想输出一个随机满足条件的组合 所以说了随机,随意
    不过这么做好像有些麻烦
    所以干脆输出所有满足条件的组合就好了
    22 条回复    2020-07-10 09:03:46 +08:00
    laike9m
        1
    laike9m  
       2020-07-09 16:45:07 +08:00
    和 Python 有啥关系?难道不写 SQL 么
    laike9m
        2
    laike9m  
       2020-07-09 16:47:10 +08:00   1
    好吧当我没说。建议把输入和想要的输出写清楚,这样才好回答
    gwy15
        3
    gwy15  
       2020-07-09 16:53:52 +08:00
    没看懂你定义的“随意随机”是什么意思,我描述下我的理解。

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

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

    https://fars.ee/rJgx/py
    AX5N
        11
    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
        12
    AX5N  
       2020-07-09 17:58:26 +08:00
    @AX5N 打错,应该是 if i[0]...................
    nuistzhou
        13
    nuistzhou  
       2020-07-09 18:05:52 +08:00 via iPhone
    我猜楼主随机的意思是从所有“行”里挑出满足这些“列”条件的。这玩意 SQL 或者 Pandas 很快解决的
    L4Liiyooooo
        14
    L4Liiyooooo  
    OP
       2020-07-09 18:29:25 +08:00
    @jstony 一开始我是想设计一个可以随机输出一个满足条件的组合的程序。。。
    L4Liiyooooo
        15
    L4Liiyooooo  
    OP
       2020-07-09 18:38:59 +08:00
    @Counter 谢谢

    这是我编辑的一个示例 就是 A,B,C,D,E 都有一个标准值(肯定大于单独一行的数值)
    然后任意行相加 大于或等于标准值 即为一种组合 比如 a+b,a+c+d 等等
    我想找出所有的组合
    aloxaf
        16
    aloxaf  
       2020-07-09 18:45:23 +08:00 via Android
    只出现一次的话,直接穷举不就行了。。。
    flamehaze
        17
    flamehaze  
       2020-07-09 19:02:20 +08:00
    没太看懂,但是我隐约觉得 excel 自带的功能就能完成,excel 里也能编程的。
    volvo007
        18
    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
        19
    L4Liiyooooo  
    OP
       2020-07-09 21:11:52 +08:00 via iPhone
    @volvo007 看明白了 是这么个事啊 厉害厉害 受教了! 感谢感谢!
    L4Liiyooooo
        20
    L4Liiyooooo  
    OP
       2020-07-09 21:17:29 +08:00 via iPhone
    @volvo007 选哪些行都行 选多少行相加也可以 只要满足条件即可 我自己都没描述清楚!你帮我说清楚了 感谢!
    aijam
        21
    aijam  
       2020-07-10 08:52:15 +08:00
    窃以为,考虑这个问题的满足(satisfaction)问题版本:判断是否存在任意一个行的组合,满足所有列的约束条件。可以很容易的 reduce 成 SAT 问题,所以可以肯定是一个 NP 问题。如此一来,基本只能靠一些 heuristics 来剪枝搜索空间了。
    yongzhenchen682
        22
    yongzhenchen682  
       2020-07-10 09:03:46 +08:00
    测试不能穷举,等价类划分一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2041 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 16:11 PVG 00:11 LAX 09:11 JFK 12:11
    Do have faith in what you're doing.
    /div>
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86