Python 获取排序列表中特定键的前n个字典
我正在编写一个脚本,计算订单发货地址与特定连锁店的每个门店位置之间的距离(以英里为单位)。到目前为止,我已经创建了一个按顺序和距离排序的字典列表。看起来是这样的:Python 获取排序列表中特定键的前n个字典,python,list,dictionary,Python,List,Dictionary,我正在编写一个脚本,计算订单发货地址与特定连锁店的每个门店位置之间的距离(以英里为单位)。到目前为止,我已经创建了一个按顺序和距离排序的字典列表。看起来是这样的: [ { "order_id": 1, "distance": 10, "storeID": 1112 }, { "order_id": 1, "distance":
[
{
"order_id": 1,
"distance": 10,
"storeID": 1112
},
{
"order_id": 1,
"distance": 20,
"storeID": 1116
},
{
"order_id": 1,
"distance": 30,
"storeID": 1134
},
{
"order_id": 1,
"distance": 40,
"storeID": 1133
},
{
"order_id": 2,
"distance": 6,
"storeID": 1112
},
{
"order_id": 2,
"distance": 12,
"storeID": 1116
},
{
"order_id": 2,
"distance": 18,
"storeID": 1134
},
{
"order_id": 2,
"distance": 24,
"storeID": 1133
}
]
[
{
"order_id": 1,
"closet_store_distance": 10,
"closest_store_id": 1112,
"second_closet_store_distance": 20,
"second_closest_store_id": 1116
},
{
"order_id": 2,
"closet_store_distance": 6,
"closest_store_id": 1112,
"second_closet_store_distance": 12,
"second_closest_store_id": 1116
}
]
从这里,我想找到每个订单id的两个最近的商店,以及它们之间的距离
我最终想要的是一个如下列表:
[
{
"order_id": 1,
"distance": 10,
"storeID": 1112
},
{
"order_id": 1,
"distance": 20,
"storeID": 1116
},
{
"order_id": 1,
"distance": 30,
"storeID": 1134
},
{
"order_id": 1,
"distance": 40,
"storeID": 1133
},
{
"order_id": 2,
"distance": 6,
"storeID": 1112
},
{
"order_id": 2,
"distance": 12,
"storeID": 1116
},
{
"order_id": 2,
"distance": 18,
"storeID": 1134
},
{
"order_id": 2,
"distance": 24,
"storeID": 1133
}
]
[
{
"order_id": 1,
"closet_store_distance": 10,
"closest_store_id": 1112,
"second_closet_store_distance": 20,
"second_closest_store_id": 1116
},
{
"order_id": 2,
"closet_store_distance": 6,
"closest_store_id": 1112,
"second_closet_store_distance": 12,
"second_closest_store_id": 1116
}
]
我不确定如何循环浏览此列表中的每个订单id并选择两个最近的门店。非常感谢您的帮助。尝试类似的方法,我假设初始数据位于名为sample.txt的文件中 生成的文件如下所示:
[
{
"second_closest_store_id": 1116,
"closet_store_distance": 10,
"closest_store_id": 1112,
"order_id": 1,
"second_closet_store_distance": 20
},
{
"second_closest_store_id": 1116,
"closet_store_distance": 6,
"closest_store_id": 1112,
"order_id": 2,
"second_closet_store_distance": 12
}
]
尝试类似的方法,我假设初始数据位于一个名为sample.txt的文件中 生成的文件如下所示:
[
{
"second_closest_store_id": 1116,
"closet_store_distance": 10,
"closest_store_id": 1112,
"order_id": 1,
"second_closet_store_distance": 20
},
{
"second_closest_store_id": 1116,
"closet_store_distance": 6,
"closest_store_id": 1112,
"order_id": 2,
"second_closet_store_distance": 12
}
]
一个很好的可读性答案,但是使用了我的一个免费库:
from PLOD import PLOD
order_store_list = [
{
"order_id": 1,
"distance": 10,
"storeID": 1112
},
{
"order_id": 1,
"distance": 20,
"storeID": 1116
},
{
"order_id": 1,
"distance": 30,
"storeID": 1134
},
{
"order_id": 1,
"distance": 40,
"storeID": 1133
},
{
"order_id": 2,
"distance": 6,
"storeID": 1112
},
{
"order_id": 2,
"distance": 12,
"storeID": 1116
},
{
"order_id": 2,
"distance": 18,
"storeID": 1134
},
{
"order_id": 2,
"distance": 24,
"storeID": 1133
}
]
#
# first, get the order_ids (place in a dictionary to ensure uniqueness)
#
order_id_keys = {}
for entry in order_store_list:
order_id_keys[entry["order_id"]] = True
#
# next, get the two closest stores per order_id
#
closest_stores = []
for order_id in order_id_keys:
top_two = PLOD(order_store_list).eq("order_id", order_id).sort("distance").returnList(limit=2)
closest_stores.append({
"order_id": order_id,
"closet_store_distance": top_two[0]["distance"],
"closest_store_id": top_two[0]["storeID"],
"second_closet_store_distance": top_two[1]["distance"],
"second_closest_store_id": top_two[1]["storeID"]
})
#
# sort by order_id again (if that is important)
#
closest_stores = PLOD(closest_stores).sort("order_id").returnList()
本例假设生产订单存储列表适合内存。如果您使用的是较大的数据集,我强烈建议您为该数据库使用数据库和python库
我的PLOD库是免费的开源MIT,但需要Python 2.7。我离发布Python 3.5还有两周的时间。请参阅一个可读性很好的答案,但使用的是我的一个免费库:
from PLOD import PLOD
order_store_list = [
{
"order_id": 1,
"distance": 10,
"storeID": 1112
},
{
"order_id": 1,
"distance": 20,
"storeID": 1116
},
{
"order_id": 1,
"distance": 30,
"storeID": 1134
},
{
"order_id": 1,
"distance": 40,
"storeID": 1133
},
{
"order_id": 2,
"distance": 6,
"storeID": 1112
},
{
"order_id": 2,
"distance": 12,
"storeID": 1116
},
{
"order_id": 2,
"distance": 18,
"storeID": 1134
},
{
"order_id": 2,
"distance": 24,
"storeID": 1133
}
]
#
# first, get the order_ids (place in a dictionary to ensure uniqueness)
#
order_id_keys = {}
for entry in order_store_list:
order_id_keys[entry["order_id"]] = True
#
# next, get the two closest stores per order_id
#
closest_stores = []
for order_id in order_id_keys:
top_two = PLOD(order_store_list).eq("order_id", order_id).sort("distance").returnList(limit=2)
closest_stores.append({
"order_id": order_id,
"closet_store_distance": top_two[0]["distance"],
"closest_store_id": top_two[0]["storeID"],
"second_closet_store_distance": top_two[1]["distance"],
"second_closest_store_id": top_two[1]["storeID"]
})
#
# sort by order_id again (if that is important)
#
closest_stores = PLOD(closest_stores).sort("order_id").returnList()
本例假设生产订单存储列表适合内存。如果您使用的是较大的数据集,我强烈建议您为该数据库使用数据库和python库
我的PLOD库是免费的开源MIT,但需要Python 2.7。我离发布Python 3.5还有两周的时间。见谢谢你@navidad。实际上,我有大约30000份订单需要循环处理。因此,这样做:order1=make_ordertop1,1 order2=make_ordertop2,2 json.dump[order1,order2],result_file,indent=3,separators=',',':'实际上是站不住脚的。我所遇到的困难是弄清楚如何循环每个订单。对不起,如果我之前不清楚的话。谢谢你的帮助。@sumojelly你知道了吗?谢谢你@navidad。实际上,我有大约30000份订单需要循环处理。因此,这样做:order1=make_ordertop1,1 order2=make_ordertop2,2 json.dump[order1,order2],result_file,indent=3,separators=',',':'实际上是站不住脚的。我所遇到的困难是弄清楚如何循环每个订单。对不起,如果我之前不清楚的话。谢谢你的帮助。@sumojelly你知道了吗?嘿@JohnAD-谢谢分享。这看起来像一个很酷的库——特别是对于像我这样习惯于以查询形式思考问题的人来说。我将安装PLOD,并让您知道它是如何运行的goesHey@JohnAD-谢谢分享。这看起来像一个很酷的库——特别是对于像我这样习惯于以查询形式思考问题的人来说。我将安装PLOD并让您知道它是如何运行的