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
maloneleo88
V2EX  ›  Python

[丧心病狂的问题] Python 这种判定的高级写法是什么?

  •  
  •   maloneleo88 · 2021-02-26 14:10:45 +08:00 · 2741 次点击
    这是一个创建于 1373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    i = 0
    try:
    if odds[12] < odds[26]:
    i = i+1
    elif odds[12] > odds[26]:
    i = i-1
    else:
    pass
    if odds[54] < odds[68]:
    i = i+1
    elif odds[54] > odds[68]:
    i = i-1
    else:
    pass
    if odds[96] < odds[110]:
    i = i+1
    elif odds[96] > odds[110]:
    i = i-1
    else:
    pass
    if odds[138] < odds[152]:
    i = i+1
    elif odds[138] > odds[152]:
    i = i-1
    else:
    pass
    if odds[180] < odds[194]:
    i = i+1
    elif odds[180] > odds[194]:
    i = i-1
    else:
    pass
    if odds[222] < odds[236]:
    i = i+1
    elif odds[222] > odds[236]:
    i = i-1
    else:
    pass
    if odds[264] < odds[278]:
    i = i+1
    elif odds[264] > odds[278]:
    i = i-1
    else:
    pass
    if odds[306] < odds[320]:
    i = i+1
    elif odds[306] > odds[320]:
    i = i-1
    else:
    pass
    if odds[348] < odds[362]:
    i = i+1
    elif odds[348] > odds[362]:
    i = i-1
    else:
    pass
    if odds[390] < odds[404]:
    i = i+1
    elif odds[390] > odds[404]:
    i = i-1
    else:
    pass
    if odds[432] < odds[446]:
    i = i+1
    elif odds[432] > odds[446]:
    i = i-1
    else:
    pass
    if odds[474] < odds[488]:
    i = i+1
    elif odds[474] > odds[488]:
    i = i-1
    else:
    pass
    if odds[516] < odds[530]:
    i = i+1
    elif odds[516] > odds[530]:
    i = i-1
    else:
    pass
    if odds[558] < odds[572]:
    i = i+1
    elif odds[558] > odds[572]:
    i = i-1
    else:
    pass
    if odds[600] < odds[614]:
    i = i+1
    elif odds[600] > odds[614]:
    i = i-1
    else:
    pass
    except IndexError:
    pass
    print(i)

    新手小白,我的判定是这么写的。我知道肯定是最低级的。 这种判定的高级写法是什么?
    - 我需要 try - except, 因为某些 odds[]值是空的,会发生 IndexError 错误。
    - odds 是字符串列表,对比的是字符串,不是数字。
    - A 组起始为 12 每隔 42 取值,B 组起始位 26 每隔 42 取值

    问:这种用循环怎么写? 先谢了!
    10 条回复    2021-02-27 01:02:33 +08:00
    pcbl
        1
    pcbl  
       2021-02-26 14:17:04 +08:00 via iPhone
    两个等差数列直接循环就可以啊
    for x in range(10):
    a=12+42*x
    b=26+42*x
    ...
    手机打的,其余部分和你的判断一样
    imn1
        2
    imn1  
       2021-02-26 14:48:56 +08:00
    此例
    后面的操作很简单,只有 i+1 / i-1 两种,可以变成 01 或者 True/False
    前面的是个有序序列,序列就必然有序号,即使中间有断层,不连续
    你只要对应出序号和操作的关系就可以了

    这样想就简单了,尤其序号是连续的
    bisect 模块,参考官方的 example,那个 def grade 的例子
    其他就自己思考吧,如无意外,可以扔掉 try...except 了

    PS: 这个 grade 的例子用途很多的,基本上连续的整数序列,分段操作都可以用上,我至少在十多个地方用了
    尤其一些时间的分段(因为时序必然是连续的),甚至不需要时间计算函数,时间函数是比较烧脑的,转为整数分段简单很多
    imn1
        3
    imn1  
       2021-02-26 15:04:47 +08:00
    嗯,看得粗了,你这个是元素之间比较,不是全部元素的应用,#2 说的不适用,要再想想
    imn1
        4
    imn1  
       2021-02-26 15:18:40 +08:00
    找到规律了,全部都是相隔 14 个位置,只用一个序列就够了
    a=[12, 54, 96, ...]
    l=len(odds)
    for x in a:
    ....if l<=x+14: break
    ....if odds[x]<odds[x+14] ...
    后面就不写了
    BBrother
        5
    BBrother  
       2021-02-26 16:04:43 +08:00
    要不你把你想解决的问题发出来?
    Sunyanzi
        6
    Sunyanzi  
       2021-02-26 17:16:56 +08:00
    我大概看了一下 ... 如果前小后大则加前大后小则减 ... 是我的话我会这样写 ...

    i.imgur.com/pG41su3.png

    代码 Python 2 适用 ... 因为 xrange 和 cmp 在 Python 3 里都没有 ... 需要自己调整 ...

    以及我没有测试数据 ... 凭空一写 ... 我自己觉得应该没啥问题 ... 但还是仅供参考 ...
    maloneleo88
        7
    maloneleo88  
    OP
       2021-02-26 17:47:35 +08:00
    @BBrother 没有想解决的问题,我就是这么写的,我觉得有点傻


    @Sunyanzi 额,现在还用 2 ?


    @pcbl 这样行吗?我这个列表是字符串,值大概是 2, 2/2.5 2.5,2.5/3 , 3 , 3/3.5 是足球盘口的让球指数。只能对比字符串


    @imn1 能行吗?比较不规则的字符串和,我还看不太明白。
    Sunyanzi
        8
    Sunyanzi  
       2021-02-26 18:27:52 +08:00
    @maloneleo88 如果你用 Python 3 的话 ... 我上面的代码只修改两处 ...

    xrange 改为 range ... 另单独定义函数 cmp( a, b ) ... 内容为 return ( a > b ) - ( a < b ) 即可 ...

    除此之外其他什么都不用动 ... 改语法不改思想 ...

    顺带一提自己写的 cmp 和原生的 cmp 还是有些许的区别 ... 但在你的应用场景里可以视为完全一致 ...
    IgniteWhite
        9
    IgniteWhite  
       2021-02-26 19:24:07 +08:00 via iPhone
    我以为您在写汇编呢
    maloneleo88
        10
    maloneleo88  
    OP
       2021-02-27 01:02:33 +08:00 via Android
    @Sunyanzi 先谢过老哥,回头我试试


    @IgniteWhite 哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 19:02 · PVG 03:02 · LAX 11:02 · JFK 14:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.