Py学习  »  Python

我怎样才能用python编写一个键顺序精确的字典呢?

Julio María Meca Hansen • 5 年前 • 1878 次点击  

我想用一组特定的键和一组特定的值制作一个字典。这些是我想用的钥匙:

k = ['date', 'deviceCategory', 'transactionId', 'productSku', 'productName', 'productCategoryHierarchy', 'channelGrouping', 'itemRevenue', 'itemQuantity']

以下是每个键的值:

v = [datetime.date(2019, 3, 5), 'desktop', 1551740677701, 60104621, '(not set)', 'sale/apartment/alicante/bajo-vinalopo/elx', 'Tráfico de Búsqueda de Pago - Venta', 0.0, 1]

如果我使用一个集合或尝试使用此来制作词典:

d = dict(zip(k, v))

甚至这个(我真正打算做的):

d = dict(zip(map(lambda x: "ga_%s" % x, k), v))

我明白了:

{'ga_itemRevenue': 0.0, 'ga_itemQuantity': 1, 'ga_deviceCategory': 'desktop', 'ga_date': datetime.date(2019, 3, 5), 'ga_channelGrouping': 'Tráfico de Búsqueda de Pago - Venta', 'ga_productSku': 60104621, 'ga_productName': '(not set)', 'ga_productCategoryHierarchy': 'sale/apartment/alicante/bajo-vinalopo/elx', 'ga_transactionId': 1551740677701}

我知道在python字典中键顺序是不相关的(至少,那些用 dict() )但我需要这些键和它们的匹配值以完全相同的顺序构成字典,这不是按字母顺序排列的。只是。。。相同的键顺序。

我试着用 collections.OrderedDict()

d = json.loads(json.dumps(x))

但它给了我一个错误,因为 datetime 对象不能序列化(或者它显示错误消息),我需要这样的对象(作为 对象),因为将用 cx_Oracle 包裹。

我也读过 frozenset() 但是好像我需要一个以前存在的集合来“冻结”它,而且一旦我创建了一套,就如同制作一本字典一样。密钥被喷洒到集合上,我需要它们按照在keys数组中声明的相同顺序。

我怎样才能做到这一点?

#编辑1。我忘了说这是在Python2.7.x中完成的

reports = response.get("reports", [])

if len(reports) > 0:
  for report in reports:
    rows = report.get("data", {}).get("rows", [])

    if len(rows) > 0:
      k = ga_dimensions + ga_metrics
      o = []

      for row in rows:
        o.append(map(lambda x, y: cast_field_type(x, y), row.get("dimensions", []) + row.get("metrics", [])[0]["values"], k))

      if len(o) > 0:
         # insert all data rows into the table
         for v in o:
           for i in range(0, len(v)):
             if k[i] == "date" and is_date(v[i]):
               v[i] = date(*map(int, v[i].split("-")))
             elif isinstance(v[i], unicode):
               v[i] = v[i].encode("utf-8")

           v = dict(zip(map(lambda x: "ga_%s" % x, k), v))
           cr.execute(q, v)

         # commit all changes
         db.commit()

这个脚本从Google Analytics(使用v4 API)获取数据,从第一行数据中推断合适的数据类型(用于Oracle数据库存储),遍历数据行,以便在发送到数据库之前对特定字段(基本上是日期和Unicode字符串)进行适当的铸造/转换/编码,完成后,提交更改以使数据真正写入。

我之所以这样做,是因为在试图提供字典时,脚本会给出这个错误:

cx_Oracle.DatabaseError: ORA-00932: inconsistent datatypes: expected DATE got NUMBER

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/54450
 
1878 次点击  
文章 [ 3 ]  |  最新文章 5 年前