社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

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

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

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
 
1868 次点击  
文章 [ 3 ]  |  最新文章 5 年前