使用具有1对多关系的python重新组织列表

2024-04-25 13:36:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试组织一个从SQL查询获得的“orders”和“items”列表。你知道吗

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

我尝试在第一个列表中循环,将用户和订单添加到新的结果列表中。 但是当我想更新这个新的列表时,我遇到了困难,我不知道怎么做。你知道吗

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


Tags: 用户name订单id列表uidorderitems
2条回答

没有必要把东西埋得这么深。我有一个以orderid为键的订单字典,一个以itemids为键的条目字典,还有一个分别以userid为键的用户字典。dictionary键类似于Pythonic中的SQL表键,在我看来,这些东西可能都有一个表。你可以把用户和用户订单放在一起,如果你想。。。。你知道吗

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]

我认为,如果您先迭代每个条目,然后按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()]

相关问题 更多 >