python - 如果我想将两个 JSON 元素放入新字典中,如何保持 JSON 的顺序
问题描述
我想从网页中获取基于每个产品 URL 的 shopids 和价格。从 JSON 加载只有两个 JSON 元素的有序字典。我传入加载 OrderedDict 参数并根据元素对 json 加载进行排序。我执行以下操作,但最终排序的 dict 不按顺序排列。还有其他方法吗?
mystr = [{"id":36887154,"final_price":1986.05,"payment_method_cost":"\\u003cem\\u003e+ 3,00 €\\u003c/em\\u003e \\u003cspan\\u003eΑντικαταβολή\\u003c/span\\u003e","net_price":1983.05,"net_price_formatted":"1.983,05 €","final_price_formatted":"1.986,05 €","shop_id":514,"no_credit_card":false,"sorting_score":[-4.8549,-340,-83,514,40],"shipping_cost":"\\u003cem\\u003e+ 0,00 €\\u003c/em\\u003e \\u003cspan\\u003eΜεταφορικά\\u003c/span\\u003e","link":"/products/show/36887154"},{"id":37336259,"final_price":1825.0,"payment_method_cost":"\\u003cem\\u003e+ 2,00 €\\u003c/em\\u003e \\u003cspan\\u003eΑντικαταβολή\\u003c/span\\u003e","net_price":1819.0,"net_price_formatted":"1.819,00 €","final_price_formatted":"1.825,00 €","shop_id":597,"no_credit_card":false,"sorting_score":[-4.71702,-57,-95,597,40],"shipping_cost":"\\u003cem\\u003e+ 4,00 €\\u003c/em\\u003e \\u003cspan\\u003eΜεταφορικά\\u003c/span\\u003e","link":"/products/show/37336259"}]
fp = urllib.request.urlopen(url2besearched)
mybytes = fp.read()
mystr = mybytes.decode("utf8")
fp.close()
mystr = mystr.rsplit('=')
mystr = mystr[1].split(";")
mystr = mystr[0]
if mystr.endswith("]"):
json_str = json.loads(mystr, object_pairs_hook=OrderedDict)
#sort json list
json_str.sort(key=lambda s: s['final_price'])
#get first
spid = json_str[0]['shop_id']
fprice = json_str[0]['final_price']
else:
mystr = json.dumps(mystr)
json_str = json.loads(mystr, object_pairs_hook=OrderedDict)
json_str.sort(key=lambda s: s['final_price'])
#get first
spid = json_str[0]['shop_id']
fprice = json_str[0]['final_price']
i =0
json_dict = OrderedDict()
for i in range(len(json_str)):
key = json_str[i]["shop_id"]
value = json_str[i]["final_price"]
json_dict.update( {key : value} )
我想根据最终价格升序获取 shop_id 和 final_price 的有序字典,但我有两个主要问题
json_dict 不是为了我从 mystr 得到错误,这个 str 没有属性排序
解决方案
OrderedDict
旨在保持条目的添加顺序。在这里你不需要,你需要根据最终价格对字典进行排序:
payments = json.loads(mystr)
final_prices = sorted([
(payment['shop_id'], payment['final_price'])
for payment in payments
], key=lambda payment: payment[1])
如果由于某种原因,您仍然需要一个OrderedDict
from this,您可以这样做:
OrderedDict(final_prices)
推荐阅读
- reactjs - 尝试在 Netlify 上部署重构的应用程序时出错
- mocha.js - 如何编写具有超时和异步的摩卡测试
- ios - 使用 Swift 在 Xcode 中的 iOS 应用开发中显示测试广告后出错
- sql - Oracle 使用 Join 和不使用 Join 的不同行数
- go - 从 MySQL 加载配置详细信息
- apache-spark - 用于 Spark 3.0 的 Elasticsearch
- angular - 无法使用服务在 Angular 中的组件之间共享数据
- amazon-web-services - 如何使用 downloadContent sourceInfo StringMap 正确格式化 AWS System Manager 文档中的语法
- angular - 创建或更新数据后表不刷新
- r - 在 R 中反应