推荐学习书目
› 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 · Jul 9, 2020 · 5023 views
    This topic created in 2313 days ago, the information mentioned may be changed or developed.
    如我有这么一个表 行为 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 设计一个简单的程序吗?有没什么书籍或者视频可以参考的?
    Supplement 1  ·  Jul 9, 2020
    感谢老哥们的回复 是我没说清楚

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

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

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

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

    这是我编辑的一个示例 就是 A,B,C,D,E 都有一个标准值(肯定大于单独一行的数值)
    然后任意行相加 大于或等于标准值 即为一种组合 比如 a+b,a+c+d 等等
    我想找出所有的组合
    aloxaf
    aloxaf
    Jul 9, 2020 via Android
    16
    只出现一次的话,直接穷举不就行了。。。
    flamehaze
    flamehaze
    Jul 9, 2020
    17
    没太看懂,但是我隐约觉得 excel 自带的功能就能完成,excel 里也能编程的。
    volvo007
    volvo007
    Jul 9, 2020
    18
    楼主的条件是,任意行相加大于标准值就可以
    但是楼主想过没有,你现在有 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
    L4Liiyooooo
    OP
    Jul 9, 2020 via iPhone
    19
    @volvo007 看明白了 是这么个事啊 厉害厉害 受教了! 感谢感谢!
    L4Liiyooooo
    L4Liiyooooo
    OP
    Jul 9, 2020 via iPhone
    20
    @volvo007 选哪些行都行 选多少行相加也可以 只要满足条件即可 我自己都没描述清楚!你帮我说清楚了 感谢!
    aijam
    aijam
    Jul 10, 2020
    21
    窃以为,考虑这个问题的满足(satisfaction)问题版本:判断是否存在任意一个行的组合,满足所有列的约束条件。可以很容易的 reduce 成 SAT 问题,所以可以肯定是一个 NP 问题。如此一来,基本只能靠一些 heuristics 来剪枝搜索空间了。
    yongzhenchen682
    yongzhenchen682
    Jul 10, 2020
    22
    测试不能穷举,等价类划分一下
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   656 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 18:33 · PVG 02:33 · LAX 10:33 · JFK 13:33
    ♥ Do have faith in what you're doing.