Python简化

Python简化,python,simplification,Python,Simplification,出生日期是介于1和2359之间的整数。每种动物也都是列表的一部分。我想将出生日期转换为列表索引,但我不确定如何转换 if (birth_time >= 2300) or (birth_time < 100): hour_animal = "RAT" elif (birth_time >= 100) and (birth_time < 300): hour_animal = "OX" elif (birth_time >= 300) and (birt

出生日期是介于1和2359之间的整数。每种动物也都是列表的一部分。我想将出生日期转换为列表索引,但我不确定如何转换

if (birth_time >= 2300) or (birth_time < 100):
    hour_animal = "RAT"
elif (birth_time >= 100) and (birth_time < 300):
    hour_animal = "OX"
elif (birth_time >= 300) and (birth_time < 500):
    hour_animal = "TIGER"
elif (birth_time >= 500) and (birth_time < 700):
    hour_animal = "RABBIT"
elif (birth_time >= 700) and (birth_time < 900):
    hour_animal = "DRAGON"
elif (birth_time >= 900) and (birth_time < 1100):
    hour_animal = "SNAKE"
elif (birth_time >= 1100) and (birth_time < 1300):
    hour_animal = "HORSE"
elif (birth_time >= 1300) and (birth_time < 1500):
    hour_animal = "SHEEP"
elif (birth_time >= 1500) and (birth_time < 1700):
    hour_animal = "MONKEY"
elif (birth_time >= 1700) and (birth_time < 1900):
    hour_animal = "ROOSTER"
elif (birth_time >= 1900) and (birth_time < 2100):
    hour_animal = "DOG"
elif (birth_time >= 2100) and (birth_time < 2300):
    hour_animal = "BOAR"
如果(出生时间>=2300)或(出生时间<100):
hour\u animal=“老鼠”
elif(出生时间>=100)和(出生时间<300):
小时动物=“牛”
elif(出生时间>=300)和(出生时间<500):
小时动物=“老虎”
elif(出生时间>=500)和(出生时间<700):
小时动物=“兔子”
elif(出生时间>=700)和(出生时间<900):
小时动物=“龙”
elif(出生时间>=900)和(出生时间<1100):
hour\u animal=“蛇”
elif(出生时间>=1100)和(出生时间<1300):
hour_animal=“马”
elif(出生时间>=1300)和(出生时间<1500):
hour_animal=“绵羊”
elif(出生时间>=1500)和(出生时间<1700):
小时动物=“猴子”
elif(出生时间>=1700)和(出生时间<1900):
小时动物=“公鸡”
elif(出生时间>=1900)和(出生时间<2100):
hour\u animal=“狗”
elif(出生时间>=2100)和(出生时间<2300):
小时动物=“野猪”
对如何简化这一点有何想法


谢谢

如果列表以
RAT
开头,则索引应为
(出生时间+100)//200%12

但最好核实一下:

signs = ['rat', 'ox', 'tiger', 'rabbit', 'dragon', 'snake', 'horse', 'sheep', 'monkey', 'rooster', 'dog', 'boar']

while True:
    time = int(input('>> '))
    print(signs[(time + 100) // 200 % 12])
步骤1:

if birth_time < 100:
    hour_animal = "RAT"
elif birth_time < 300:
    hour_animal = "OX"
elif birth_time < 500:
    hour_animal = "TIGER"
elif birth_time < 700:
    hour_animal = "RABBIT"
elif birth_time < 900:
    hour_animal = "DRAGON"
elif birth_time < 1100:
    hour_animal = "SNAKE"
elif birth_time < 1300:
    hour_animal = "HORSE"
elif birth_time < 1500:
    hour_animal = "SHEEP"
elif birth_time < 1700:
    hour_animal = "MONKEY"
elif birth_time < 1900:
    hour_animal = "ROOSTER"
elif birth_time < 2100:
    hour_animal = "DOG"
elif birth_time < 2300:
    hour_animal = "BOAR"
else:
    hour_animal = "RAT"
如果出生时间<100:
hour\u animal=“老鼠”
elif出生时间<300:
小时动物=“牛”
elif出生时间<500:
小时动物=“老虎”
elif出生时间<700:
小时动物=“兔子”
elif出生时间<900:
小时动物=“龙”
elif出生时间<1100:
hour\u animal=“蛇”
elif出生时间<1300:
hour_animal=“马”
elif出生时间<1500:
hour_animal=“绵羊”
elif出生时间<1700:
小时动物=“猴子”
elif出生时间<1900:
小时动物=“公鸡”
elif出生时间<2100:
hour\u animal=“狗”
elif出生时间<2300:
小时动物=“野猪”
其他:
hour\u animal=“老鼠”
请注意,我在开始和结束时加入了两次RAT,这让我消除了一半的条件


步骤2:请注意,数字是100的倍数,距离200的倍数为100。因此,正如@Hyperboreus的解决方案(他在我打字时提交了该解决方案)。

您可以设置一个具有最小和最大时间的dict,并将“RAT”作为默认值返回:

birth_times = {"OX": {"min":100, "max":300},
               "TIGER": {"min":300, "max":500},
               ...
               }

def animal(btime):
    return ([k for k in birth_times.keys()
             if birth_times[k]["min"] <= btime < birth_times[k]["max"]]
            + ["RAT"])[0]
birth_times={“OX”:{“min”:100,“max”:300},
“老虎”:{“最小”:300,“最大”:500},
...
}
def动物(B时间):
return([k代表k在birth\u times.keys()中)
如果出生时间为[k][“min”],您可以在此处使用该模块。此处在O(logn)时间中查找特定索引,因此您的
if
-
elif
s链减少为一个
if

import bisect

def solve(lis1, lis2, n):
    ind = bisect.bisect_right(lis1, n) - 1
    if 0 <= ind < len(lis1)-1:
        return lis2[ind]
    return 'RAT'

birth_time = [100, 300, 500, 700, 900, 1100, 1300, 1500, 1700, 1900, 2100, 2300]

hour_animal = ['OX', 'TIGER', 'RABBIT', 'DRAGON', 'SNAKE', 'HORSE', 'SHEEP', 'MONKEY', 'ROOSTER', 'DOG', 'BOAR']

下面有几个答案,因此仅供参考,您可以将化合物的
条件压缩/简化为例如
2100,只需计算指数(在本例中
(出生时间+100)//200%12
)应为O(1)。虽然我不确定这对于12个元素的列表是否有任何重要性。这个答案似乎有点过分,因为简单的算术就可以做到。如果速度真的是个问题,我会使用一个0到23键的dict,然后查找
出生时间//100
>>> solve(birth_time, hour_animal, 150)
'OX'
>>> solve(birth_time, hour_animal, 2400)
'RAT'
>>> solve(birth_time, hour_animal, 1300)
'SHEEP'
>>> solve(birth_time, hour_animal, 2300)
'RAT'
>>> solve(birth_time, hour_animal, 90)
'RAT'
>>> solve(birth_time, hour_animal, 1600)
'MONKEY'