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

2021-02-26 14:10:45 +08:00
 maloneleo88
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 取值

问:这种用循环怎么写? 先谢了!
2718 次点击
所在节点    Python
10 条回复
pcbl
2021-02-26 14:17:04 +08:00
两个等差数列直接循环就可以啊
for x in range(10):
a=12+42*x
b=26+42*x
...
手机打的,其余部分和你的判断一样
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
2021-02-26 15:04:47 +08:00
嗯,看得粗了,你这个是元素之间比较,不是全部元素的应用,#2 说的不适用,要再想想
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
2021-02-26 16:04:43 +08:00
要不你把你想解决的问题发出来?
Sunyanzi
2021-02-26 17:16:56 +08:00
我大概看了一下 ... 如果前小后大则加前大后小则减 ... 是我的话我会这样写 ...

i.imgur.com/pG41su3.png

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

以及我没有测试数据 ... 凭空一写 ... 我自己觉得应该没啥问题 ... 但还是仅供参考 ...
maloneleo88
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
2021-02-26 18:27:52 +08:00
@maloneleo88 如果你用 Python 3 的话 ... 我上面的代码只修改两处 ...

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

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

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


@IgniteWhite 哈哈

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

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

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

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

© 2021 V2EX