0

Birth_date は 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"

これをどのように単純化できるかについて何か考えはありますか?

ありがとう!

4

4 に答える 4

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])
于 2013-12-10T14:56:48.843 に答える
0

ここでbisectモジュールを使用できます。ここでは、 O(log N)bisect.bisect_right時間で特定のインデックスを見つけるため、一連の- s は単一の に削減されます。ifelifif

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'
于 2013-12-10T15:12:28.633 に答える
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 回入れていることに注意してください。これにより、条件の半分を削除できました。

ステップ 2: 数値が 100 の倍数であり、200 の倍数から 100 離れていることに注意してください。@Hyperboreus の解決策として (私が入力している間に彼が提出しました)。

于 2013-12-10T15:01:20.940 に答える
0

最小時間と最大時間で 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]
于 2013-12-10T15:08:15.543 に答える