我想用一组特定的键和一组特定的值制作一个字典。这些是我想用的钥匙:
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