社区所有版块导航
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 年前 • 1850 次点击  

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

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
 
1850 次点击  
文章 [ 3 ]  |  最新文章 5 年前
Christopher Jones
Reply   •   1 楼
Christopher Jones    6 年前

需要注意两件重要的事情:

Sam
Reply   •   2 楼
Sam    6 年前

上面的解决方案可能是您所需要的,但是如果您使用panda,您将得到一个中间数据帧,这使得操作、分析和可视化数据更容易(如果这是您想要的途径)。解决方案如下:

import datetime
import pandas as pd

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]

df = pd.concat([pd.DataFrame(v, k)], axis=1)

# the dataframe
date                                                     2019-03-05
deviceCategory                                              desktop
transactionId                                         1551740677701
productSku                                                 60104621
productName                                               (not set)
productCategoryHierarchy  sale/apartment/alicante/bajo-vinalopo/elx
channelGrouping                 Tráfico de Búsqueda de Pago - Venta
itemRevenue                                                       0
itemQuantity                                                      1

dict = df.to_dict()
results = dict[0]
results

# the dictionary
{'date': datetime.date(2019, 3, 5),
 'deviceCategory': 'desktop',
 'transactionId': 1551740677701,
 'productSku': 60104621,
 'productName': '(not set)',
 'productCategoryHierarchy': 'sale/apartment/alicante/bajo-vinalopo/elx',
 'channelGrouping': 'Tráfico de Búsqueda de Pago - Venta',
 'itemRevenue': 0.0,
 'itemQuantity': 1}
Andrew DeCotiis-Mauro
Reply   •   3 楼
Andrew DeCotiis-Mauro    6 年前

collections.OrderedDict 好像做了你想做的事。为了说明@chepner提到的 OrderedDict

#encoding: utf-8
from collections import OrderedDict
import datetime

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 = OrderedDict(zip(k,v))
for i in d:
  print('{}: {}'.format(i,d[i]))

print('\n\n')

print(d)

结果是:

date: 2019-03-05
deviceCategory: desktop
transactionId: 1551740677701
productSku: 60104621
productName: (not set)
productCategoryHierarchy: sale/apartment/alicante/bajo-vinalopo/elx
channelGrouping: Tráfico de Búsqueda de Pago - Venta
itemRevenue: 0.0
itemQuantity: 1



OrderedDict([('date', datetime.date(2019, 3, 5)), ('deviceCategory', 'desktop'), ('transactionId', 1551740677701), ('productSku', 60104621), ('productName', '(not set)'), ('productCategoryHierarchy', 'sale/apartment/alicante/bajo-vinalopo/elx'), ('channelGrouping', 'Tr\xc3\xa1fico de B\xc3\xbasqueda de Pago - Venta'), ('itemRevenue', 0.0), ('itemQuantity', 1)])