2013-12-10 29 views
0

Birth_date是1到2359之間的整數。每個動物也是列表的一部分。我想將出生日期轉換爲列表索引,但我不知道如何。Python簡化

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" 

有關如何簡化它的任何想法?

謝謝!

+1

有下面是幾個答案,所以這只是fyi,你可以將你的化合物'if'條件合併/簡化爲例如。 '2100 <= birth_time <2300'等 – Levon

回答

2

如果您的名單以RAT開頭,那麼指數應該是(birth_time + 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]) 
0

第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" 

注意,我把RAT兩次,在開始和結束,這讓我卸下一半的條件。

步驟2:注意數字是100的倍數,並且離200的倍數是100。所以@Hyperboreus的解決方案(他在我輸入時提交了它)。

0

您可以設置了最小和最大時間的字典,並返回「老鼠倉」作爲默認:

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] 
0

你可以在這裏使用bisect模塊。這裏bisect.bisect_right找到特定指數爲O(log N)時間,所以你的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'] 

演示:

>>> 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' 
+0

簡單地計算索引(在這種情況下'(birth_time + 100)// 200%12')應該是O(1)。雖然我不確定這對於12個元素列表是否重要。這個答案似乎有點矯枉過正,因爲簡單的算術可以做到這一點。如果速度確實是一個問題,我會使用一個從0到23的鍵的字典,然後查找'birth_time // 100'。 – Hyperboreus