2016-06-15 55 views
0

我有4個表:試圖做一個自然連接使用python標準庫

  1. shops(屬性:shop_idnamelatlng
  2. products(屬性:product_idshop_idtitlepopularity
  3. tags(屬性:tag_id,tag
  4. taggings(屬性:tagging_idshop_idtag_id

我想做的事情在我的所有表的自然連接,只產生一個表。自然連接與內部連接相同,但shops.shop_id = products.shop_id = taggings.shop_idtags.tag_id = taggings.tag_id

import csv 

print "This is going to take a while ..."  

shops = list(csv.reader(open('data/shops.csv'), delimiter=',')) 
products = list(csv.reader(open('data/products.csv'), delimiter=',')) 
tag = list(csv.reader(open('data/tags.csv'), delimiter=',')) 
taggings = list(csv.reader(open('data/taggings.csv'), delimiter=',')) 


shops_products = [] 

hash_ = {} 
for idx, row1 in enumerate(shops): 
    hash_[row1[0]] = idx 

for row2 in products: 
    if row2[1] in hash_: 
     shops_products.append(shops[hash_[row2[1]]] + row2) 


print "shops_products done ..." 
print len(shops_products) 


tags_taggings = [] 

hash_ = {} 
for idx, row1 in enumerate(tag): 
    hash_[row1[0]] = idx 

for row2 in taggings: 
    if row2[2] in hash_: 
     tags_taggings.append(tag[hash_[row2[2]]] + row2) 


print "tags_taggings done ..." 
print len(tags_taggings) 

現在我有一個名爲shops_productstags_taggings 2個表。如果我把它們合併在一起,我就得到我想要的桌子。

然而,shops_productstags_taggings具有相同shops_id很多行,所以我不能把它們合併我合併表shopsproductstagstaggings的方式。

我可以使用嵌套循環合併它們,但這會導致O(n^2)複雜度超過40分鐘才能完成。

我需要幫助搞清楚如何以我在代碼中加入其他表的方式進行此操作。這將是一個令人滿意的O(n),並很快完成。

+0

能告訴你的決賽桌將是什麼樣子的樣本? –

+0

它要具有屬性shop_id,名稱,緯度,經度的product_id,shop_id,標題,人氣,數量TAG_ID,TAG_NAME,tagging_id,shop_id,TAG_ID 我知道某些屬性具有相同的名稱,這僅僅是一個側面合併這些表格的效果,而不用費力去搞清楚現在如何去除重複的列,但重複的屬性將具有相同的信息。如果您需要任何其他信息可以幫助您獲得更好的圖片,請告訴我,並致謝 – RetroCode

+0

「產品」表有多個參考商店?例如有兩種產品具有相同的'shop_id'。 –

回答

0

所以答案是......

from collections import defaultdict 
s_p_t_t=[] 
hash_= defaultdict(list) 
for idx, row in enumerate(shops_products): 
    hash_[row[0]].append(idx) 

for row in tags_taggings: 
    if row[3] in hash_: 
     for x in hash_[row[3]]: 
      s_p_t_t.append(shops_products[x]+row)