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 · 3491 次点击
    这是一个创建于 1599 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如我有这么一个表 行为 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   ·   实用小工具   ·   2996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:05 · PVG 22:05 · LAX 06:05 · JFK 09:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.