【问题标题】:Mapping values in a list to a known dictionary format without chronological order将列表中的值映射到没有时间顺序的已知字典格式
【发布时间】:2020-12-26 14:20:54
【问题描述】:

我有一个值列表如下:

dataPoint1 = ["unnamed", "A0001", "2009-04-01 00:01", "HT","146.5", "146.75", "FromTestDevice0001", "181"]

这个列表的格式是

 dataHeader = [Name, ID, DateTime, TypeOfDevice, Reading1, Reading2, Comment, Max Value]

我需要将这些值按以下格式放入字典中; “id”(字符串)、“name”(字符串)、“year”(int)、“month”(int)、“day”(int)、“hour”(int)、“reading1”(float)、“读数2”(浮点数),“最大值”(浮点数)。 预期输出:

{"id": "A0001", "name": "unnamed", "year": 2009, "month": 04, "day": 01, "hour": 00, "reading1": 146.5, "reading2": 146.75, "max": 181}

这些是按“dataHeader”顺序排列的固定输出(例如 dataPoint1)。如何将这些值映射到给定格式的字典?

我目前运行的代码如下。有没有其他方法可以做到这一点? 我们可以在时间或内存方面进行优化吗? zip 函数不起作用(对我而言),因为数据点和映射不按顺序排列并且由于类型转换。

def parse_data(dataPoint):
  "This function maps dataPoints to a dictionary"
  data_dictionary = dict()

  if dataPoint[1] != '':
      data_dictionary['id'] = dataPoint[1]

  if dataPoint[0] != '':
      data_dictionary['name'] = dataPoint[0]

  if dataPoint[2] != '':
      data_dictionary['year'] = int(dataPoint[2][:4])
      data_dictionary['month'] = int(dataPoint[2][5:7])
      data_dictionary['day'] = int(dataPoint[2][8:10])
      data_dictionary['hour'] = int(dataPoint[2][11:13])

  if dataPoint[4] != '':
      data_dictionary['reading1'] = float(dataPoint[4])

  if dataPoint[5] != '':
      data_dictionary['reading2'] = float(dataPoint[5])

  if dataPoint[7] != '':
      data_dictionary['max'] = float(dataPoint[7])

  return data_dictionary

【问题讨论】:

    标签: python list dictionary mapping chronological


    【解决方案1】:

    你可以这样做:

    import datetime as dt
    
    dataHeader = ['Name', 'ID', 'Year', 'Month', 'Day', 'hour', 'Reading1', 'Reading2', 'MaxValue']
    dP1 = ["unnamed", "A0001", "2009-04-01 00:01", "HT","146.5", "146.75", "From TestDevice0001", "181"]
    date = dt.datetime.strptime(dP1[2], '%Y-%m-%d %H:%M')
    #dP1 = dP1[:2]+[date.year]+[date.month]+[date.day]+[date.hour]+dP1[4:6]+dP1[7:]
    dP1 = dP1[:2]+[int(date.year)]+[int(date.month)]+[int(date.day)]+[int(date.hour)]+[float(dP1[4])]+[float(dP1[5])]+[float(dP1[7])]
    datadictionary = dict(zip(dataHeader, dP1))
    

    【讨论】:

    • 我试过这种方式,但这里也缺少类型转换。
    • 看起来简洁明了。不确定我将在哪里获得优化(内存或时间?)我假设 zip 是 O(1) 并且可能更好地使用而不是多个 if 语句。
    • 我认为 zip 是 O(n),因为至少您必须查看输入中的每个元素,但您的解决方案也是如此。我想没有太大的改进空间。 zip 是一个内置函数,因为它可能比线性因子更快,但不是在时间复杂度类方面。
    【解决方案2】:

    你可以这样做

    data_dictionary=dict(zip(dataHeader,dataPoint1))
    

    结果会是这样的:

    {'Comment': 'FromTestDevice0001', 'TypeOfDevice': 'HT', 'Name': 'unnamed', 'Reading1': '146.5', 'Reading2': '146.75', 'DateTime': '2009-04-01 00:01', 'Max Value': '181', 'ID': 'A0001'}
    

    这并不完全符合您的要求,但您可以通过编辑 dataHeader,dataPoint1 来实现,给出单独的日期/时间/年份,

    或者你可以这样做

    dataPoint1[2]=[int(dataPoint1[2][:4]),int(dataPoint1[2][5:7]),int(dataPoint1[2][8:10]),int(dataPoint1[2][11:13])]
    

    结果会是这样的:

    {'Comment': 'FromTestDevice0001', 'TypeOfDevice': 'HT', 'Name': 'unnamed', 'Reading1': '146.5', 'Reading2': '146.75', 'DateTime': [2009, 4, 1, 0], 'Max Value': '181', 'ID': 'A0001'}
    

    【讨论】:

    • 这里的主要问题之一是“类型”转换。使用 'zip' 函数会给出字符串,但不会给出 int 或 floats 类型
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多