在python中逐步将微秒转换为各自的转换的最佳方法?

时间:2015-07-06 16:48:53

标签: python

我目前有一个预定义的字典(忽略字母)。不过,我希望转换更加强大。说输入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'}

3 个答案:

答案 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}

不知道对你有多大帮助,但我觉得它很整洁。并不是说它可读或有意义......