2013-10-16 27 views
1

我試圖組織一個從SQL查詢中獲得的'orders'和'items'列表。使用python重新組織一個到多個關係的列表

我的python列表包含用戶關心的訂單。 每個用戶有1或n個訂單,一個訂單可以包含0或n個項目。 它看起來如下:

information = [ 
{'item_id': 2, 
    'item_name': 'glass', 
    'order_id': 21, 
    'uid': 1, 
    'uname': 'john'}, 
{'item_id': 3, 
    'item_name': 'wine', 
    'order_id': 21, 
    'uid': 1, 
    'uname': 'john'}, 
{'item_id': 1, 
    'item_name': 'napkin', 
    'order_id': 12, 
    'uid': 1, 
    'uname': 'john'}, 
{'item_id': 1, 
    'item_name': 'napkin', 
    'order_id': 12, 
    'uid': 2, 
    'uname': 'peter'} 
... etc ... 
] 

我想擁有的是:

[{'orders': [{'items': [{'item_id': 2, 'item_name': 'glass'}, 
         {'item_id': 3, 'item_name': 'wine'}], 
       'order_id': 21}, 
      {'items': [{'item_id': 1, 'item_name': 'napkin'}], 
       'order_id': 12}], 
    'uid': 1, 
    'uname': 'john'}, 
{'uid': 2, 'uname': 'peter'} ... etc ... ] 

我在第一個列表追加用戶和訂單到一個新的結果列表試圖循環。 但是當我想更新這個新列表時,我遇到了困難,我不知道該怎麼做。

也許有人有任何線索或任何相關的信息來解決這個問題? 非常感謝,

回答

1

沒有必要如此深入地嵌套的東西。我有一個orderids作爲關鍵字的訂單字典,itemid作爲關鍵字的項目字典以及所有分別使用userids作爲關鍵字的用戶字典。字典鍵是SQL表鍵的Pythonic等價物,在我看來,這些東西中可能有一個表。你可以把用戶和userorders在一起,如果你想以某種方式....

users = {1:'john'} 
userorders = {1:[21]} 
#goes to a list of item ids ONLY 
orders = {21:[2,3]} 
items = {2:'glass',3:'wine'} 

現在,所有你需要做的就是一個項目追加到訂單和追加訂單給用戶。

所以你讓一個SQL查詢,取回訂單問:

users[Q['uid']] = Q['uname'] 
userorders[Q['uid']].append(Q['order_id']) 
orders[Q['orderid']].append(Q['item_id']) 
items[Q['item_id']] = Q['itemname'] 

你可以找到的物品約翰下令:

for order in userorders[1]: 
    for item in orders[order]: 
    print items[item] 
+0

歡迎來到stackoverflow! –

+0

感謝您的回答斯科特。 – gallab

0

我想你可以重新排列每個字典的項目如果先迭代每個條目,然後按order_id對項目進行分組:

from collections import defaultdict 

# information = [...] 
result = {} 

for entry in information: 
    uid = entry['uid'] 
    order_id = entry['order_id'] 
    if not uid in result: 
     result[uid] = {'uid': uid, 'uname': entry['uname'], 'orders': defaultdict(list)} 

    result[uid]['orders'][order_id].append({ 
     'item_id': entry['item_id'], 
     'item_name': entry['item_name']} 
    ) 

for uid, value in result.iteritems(): 
    value['orders'] = [{'items': items, 'order_id': order_id} for order_id, items in value['orders'].iteritems()] 
+0

感謝您的回答A. Rodas。 – gallab

相關問題