2016-12-09 68 views
1

我編寫了一個腳本,用於計算訂單的送貨地址和特定商店連鎖店的每個商店位置之間的距離(英里)。到目前爲止,我已經創建了一個排序的字典列表(按order_id排序,然後再按距離排序)。它看起來像這樣:取出排序列表中特定鍵的前n個詞典

[ 
     { 
      "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,以及它們的距離。

什麼我最終想落得的是,像這樣的列表:

[ 
     { 
      "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 
     } 
] 

我不確定如何通過此列表中的每個ORDER_ID循環,並選擇最接近的兩個店。任何幫助表示讚賞。

回答

0

嘗試類似這樣的事情,我假設初始數據位於名爲sample.txt的文件中。

import json 
from operator import itemgetter 

def make_order(stores, id): 
    return { 
     "order_id": id, 
     "closet_store_distance": stores[0][1], 
     "closest_store_id": stores[0][0], 
     "second_closet_store_distance": stores[1][1], 
     "second_closest_store_id": stores[1][0] 
    } 

def main(): 
    with open('sample.txt', 'r') as data_file: 
     data = json.loads(data_file.read()) 

    id1 = {} 
    id2 = {} 
    for i in data: 
     if i["order_id"] == 1: 
     id1[i["storeID"]] = i["distance"] 
     else: 
     id2[i["storeID"]] = i["distance"] 

    top1 = sorted(id1.items(), key=itemgetter(1)) 
    top2 = sorted(id2.items(), key=itemgetter(1)) 

    with open('results.json', 'w') as result_file: 
     order1 = make_order(top1, 1) 
     order2 = make_order(top2, 2) 
     json.dump([order1, order2], result_file, indent=3, separators=(',', ': ')) 

if __name__ == '__main__': 
    main() 

生成的文件是這樣的:(。但用我的自由的圖書館之一)

[ 
    { 
     "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 
    } 
] 
+0

謝謝@navidad。實際上,我有大約30,000個訂單需要循環使用。所以,這樣做: order1 = make_order(top1,1) order2 = make_order(top2,2) json.dump([order1,order2],result_file,indent = 3,separators =(',',': ')) 不會成立。我遇到麻煩的是弄清楚如何遍歷每個訂單。 對不起,如果我以前不清楚。我感謝您的幫助。 – sumojelly

+0

@sumojelly你知道嗎? – Navidad20

0

一個很好的讀答題:

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() 

這個例子假設生產order_store_list將適合在記憶中。如果您使用的是較大的數據集,我強烈建議使用該數據庫的數據庫和python庫。

我的PLOD庫是免費且開源的(MIT),但需要Python 2.7。我距離Python 3.5版本大約兩週時間。見https://pypi.python.org/pypi/PLOD/0.1.7

+0

嘿@JohnAD - 感謝分享。這看起來像一個很酷的圖書館 - 尤其對於像我這樣習慣於以查詢形式思考事物的人。我將安裝PLOD並讓你知道它是如何發生的 – sumojelly