1

我正在尝试组织从 SQL 查询获得的“订单”和“项目”列表。

我的 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 ... ]

我试图遍历第一个列表,将用户和订单附加到一个新的结果列表中。但是当我想更新这个新列表时遇到了困难,我不知道该怎么做。

也许有人有任何线索或任何相关信息来解决这个问题?多谢,

4

2 回答 2

1

没有必要把东西嵌套得那么深。我会有一个以 orderids 作为键的订单字典,一个以 itemids 作为键的项目字典,以及一个以 userids 作为键的用户字典。字典键有点类似于 SQL 表键的 Pythonic 等价物,在我看来,这些东西中的每一个都可能有一个表。如果您愿意,可以将用户和用户订单放在一起......

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

现在您所要做的就是将一个项目附加到一个订单并将一个订单附加到一个用户。

所以你做一个 SQL 查询,得到一个订单 Q:

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']

您可以通过以下方式找到 john 订购的商品:

for order in userorders[1]:
  for item in orders[order]:
    print items[item]
于 2013-10-16T13:57:08.307 回答
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()]
于 2013-10-16T14:39:37.293 回答