我目前有一个预定义的字典(忽略字母)。不过,我希望转换更加强大。说输入33000000微秒并知道转换为33秒。然后在一分钟内任何微秒输入,但在一小时内显示为分钟等。是否可以在不需要这个预定义字典的情况下进行编码?优选地,该函数接收微秒输入然后输出适当的转换。
'A100.txt' :'100 us',
'B500.txt' :'500 us',
'C1000.txt' :'1 ms',
'D4000.txt' :'4 ms',
'E5000.txt' :'10 ms',
'F30000.txt' :'30 ms',
'G100000.txt' :'100 ms',
'H300000.txt' :'300 ms',
'I1000000.txt' :'1 sec',
'J3000000.txt' :'3 secs',
'K10000000.txt' :'10 secs',
'L30000000.txt' :'30 secs',
'M60000000.txt' :'1 min',
'N180000000.txt' :'3 mins',
'O600000000.txt' :'10 mins',
'P1800000000.txt' :'30 mins',
'Q3600000000.txt' :'1 hr',
'R7200000000.txt' :'2 hrs',
'S14400000000.txt' :'4 hrs'}
答案 0 :(得分:3)
这允许您以相对自然的方式添加转换,以便严格提升单位堆栈。它比ifs的大块更通用。
units = [[1000, 'us'],
[1000, 'ms'],
[60, 's'],
[60, 'min'],
[24, 'h'],
[365, 'day'],
[None, 'year']]
def convert(quantity):
divisor = 1
for factor, name in units:
if factor is None or quantity < divisor*factor:
return "{} {}".format(quantity/divisor, name)
divisor *= factor
答案 1 :(得分:2)
这可以通过一长串if
语句来完成。由于Python中没有switch
语句,并且字典不能用于>
和<
,因此这是最佳解决方案。
你可能会做的事情是:
def convert(text):
t = int(text)
if t<1000: #millisecond
return str(t)+' us'
elif t<1000000: #second
return str(int(t/1000))+' ms'
elif t==1000000: #is a second
return '1 sec'
#etc.
替代解决方案:
units = [("us", 1), ("ms", 1000), ("sec", 1000000)...]
for string, divisor in units:
if t==divisor:
return "1 "+string
elif t>divisor:
if round(float(t)/divisor)==1:
return "1 "+string
else:
return str(int(round(float(t)/divisor)))+string+"s"
希望这将是紧凑性,可伸缩性和可读性之间更好的折衷。
答案 2 :(得分:1)
@Bcdan说&#34;这个尽可能紧凑&#34;。接受了挑战。
>>> l = [("micro",1),("milli",1000),("s",1000),("m",60),("h",60)]
>>> d = {"micro":33000000}
>>> for i in range(1,len(l)): d[l[i][0]],d[l[i-1][0]] = divmod(d[l[i-1][0]],l[i][1])
>>> d
{'m': 0, 's': 33, 'h': 0, 'milli': 0, 'micro': 0}
不知道对你有多大帮助,但我觉得它很整洁。并不是说它可读或有意义......