Python多维数组解析为一维数组和UTC时间字符串间互转解法

177 阅读3分钟

这是我参与更文挑战的第19天,活动详情查看: 更文挑战

多维数组解析为一维数组

假如有以下一个数组,需要解析为一维数组:

[1, [2, [3, [8888,666], [4, 6, [45, 78, [99]], [45,67,89,[999,[4543,90]]]]], 45]]

变为:

[1, 2, 3, 4, 6, 45, 78, 99, 45, 67, 89, 999, 4543, 90, 45]

这里,我们这样想就很容易解决这个问题:

  1. 如果是列表,那么需要进一步解析
  2. 如果不是列表,那么就直接放入结果中 这里,看到了递归的影子了吧,对,递归,非常容易理解形象
def flatten(sample):
    if isinstance(sample, list):
        result = []
        for item in sample:
            result += flatten(item)
    else:
        return [sample]
    
    return result

看看效果:

if __name__ == "__main__":
    sample = [1, [2, [3, [8888, 666], [4, 6, [45, 78, [99]], [45, 67, 89, [999, [4543, 90]]]]], 45]]
    print flatten(sample)
# [1, 2, 3, 8888, 666, 4, 6, 45, 78, 99, 45, 67, 89, 999, 4543, 90, 45]

这样,无论是多少维的嵌套,都可以解决。

UTC时间字符串间互转

后台开发经常需要对时间进行记录和返回时间戳给前端。

为了通用性,我们一般都会存储UTC的时间戳。

但是,一般对数据库进行时间戳字段的插入,往往是以格式化的时间字符串进行插入的,例如:

insert into table_name(user_id, login_time) values ("RidingRoad", "2018-11-13 12:19:39");

业务场景

假如前端传来了用户的某个UTC时间戳,后台需要录入数据库,当前端请求时候,返回这个UTC时间戳。

业务分析

这个UTC时间戳的状态变化:

  1. 前端传过来的:double型的时间戳

  2. 插入数据库时:格式化的时间字符串

  3. 返回给前端的:double型的时间戳

所以我们需要一个对时间和格式化的时间字符串进行转换的函数

转换实现

import time

# UTC 转换为 格式化的时间字符串
def u2s(utc_timestamp):
   return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(utc_timestamp))

# 格式化的时间字符串 转换为 UTC 
def s2u(utc_time_string):
   return time.mktime(time.strptime(utc_time_string, "%Y-%m-%d %H:%M:%S"))\
          - time.mktime(time.gmtime(0))
示例
if __name__ == "__main__":
   # 取得当前的UTC时间戳
   timestamp = time.time()
   print(timestamp)

   # 把UTC时间戳转换为日期格式字符串
   utc_time_string = u2s(timestamp)
   print(utc_time_string)

   # 把日期字符串转换回UTC时间戳
   utc_timestamp = s2u(utc_time_string)
   print(utc_timestamp)

   # 把转换后的UTC时间戳转换成日期字符串
   # 看看误差,秒数也一样,一般不影响
   after_conver = u2s(utc_timestamp)
   print(after_conver)

结果输出

两个时间戳的误差在零点毫秒级,前后的日期格式字符串一样,一般的业务可以接受这样的误差。有更精准的方法,下面评论告诉我吧。

1542112115.95
2018-11-13 12:28:35
1542112115.0
2018-11-13 12:28:35