python中的转换列表

python中的转换列表,python,Python,大家好,我有一本书 [{"seller_id": 3, "item": {"product_id": 4, "amount": 1, "id": 9}}, {"seller_id": 1, "item": {"product_id": 1 , "amount": 2, "id": 10}}, {"seller_id": 3, "item": {"product_id": 3, "amount": 2, "id": 11}}, {"seller_id ": 1," item ": {" pr

大家好,我有一本书

[{"seller_id": 3, "item": {"product_id": 4, "amount": 1, "id": 9}},
 {"seller_id": 1, "item": {"product_id": 1 , "amount": 2, "id": 10}},
 {"seller_id": 3, "item": {"product_id": 3, "amount": 2, "id": 11}},
 {"seller_id ": 1," item ": {" product_id ": 2," amount ": 2," id ": 12}}]
我想分组,这意味着相同的卖家将再次分组项目

返回的结果如下所示:

[{"seller_id": 3, "list_item": [{"product_id": 4, "amount": 1, "id": 9},
 {"product_id": 3, "amount": 2, "id": 11}]},
 {"seller_id": 1, "list_item": [{"product_id": 1, "amount": 2, "id": 10},
 {"product_id": 1, "amount": 2, "id": 10}, {"product_id": 2, "amount": 2, "id": 12}]}]
谁有这个想法?

使用(并假设某些键和值周围的奇怪间距是偶然的):

使用(并假设某些键和值周围的奇怪间距是偶然的):


这里有一个解决方案,它可以构建一个字典,然后将其扁平化为您想要的格式,还有一个解决方案,它可以在一次理解中完成整个工作

from collections import defaultdict

catalog = [
    {"seller_id": 3, "item": {"product_id": 4, "amount": 1, "id": 9}},
    {"seller_id": 1, "item": {"product_id": 1, "amount": 2, "id": 10}},
    {"seller_id": 3, "item": {"product_id": 3, "amount": 2, "id": 11}},
    {"seller_id": 1, "item": {"product_id": 2, "amount": 2, "id": 12}}
]

new_catalog = defaultdict(list)
for entry in catalog:
    new_catalog[entry["seller_id"]].append(entry["item"])

result = [{"seller_id": i, "list_item": l} for i, l in new_catalog.items()]

print(result)

direct = [{"seller_id": i, "list_item": [c["item"] for c in catalog if c["seller_id"] == i]}
          for i in set([c["seller_id"] for c in catalog])]

print(direct)

编辑:更改了空字典的手动构造,并改为使用defaultdict(列表)添加新元素,因为这正是所需的。这里有一个解决方案,它可以构建一个字典,然后将其展平为所需的格式,第二个解决方案可以在一次理解中完成全部工作

from collections import defaultdict

catalog = [
    {"seller_id": 3, "item": {"product_id": 4, "amount": 1, "id": 9}},
    {"seller_id": 1, "item": {"product_id": 1, "amount": 2, "id": 10}},
    {"seller_id": 3, "item": {"product_id": 3, "amount": 2, "id": 11}},
    {"seller_id": 1, "item": {"product_id": 2, "amount": 2, "id": 12}}
]

new_catalog = defaultdict(list)
for entry in catalog:
    new_catalog[entry["seller_id"]].append(entry["item"])

result = [{"seller_id": i, "list_item": l} for i, l in new_catalog.items()]

print(result)

direct = [{"seller_id": i, "list_item": [c["item"] for c in catalog if c["seller_id"] == i]}
          for i in set([c["seller_id"] for c in catalog])]

print(direct)
from collections import defaultdict

data = [
    {"seller_id": 3, "item": {"product_id": 4, "amount": 1, "id": 9}},
    {"seller_id": 1, "item": {"product_id": 1, "amount": 2, "id": 10}},
    {"seller_id": 3, "item": {"product_id": 3, "amount": 2, "id": 11}},
    {"seller_id": 1, "item": {"product_id": 2, "amount": 2, "id": 12}}
]

grouped = defaultdict(list)
flattened = []

for item in data:
    grouped[item['seller_id']].append(item['item'])

for k, v in grouped.items():
    flattened.append({'seller_id': k, 'list_item': v})

print(flattened)
编辑:更改了空字典的手动构造,并改为使用defaultdict(list)添加新元素,因为这正是所需的

from collections import defaultdict

data = [
    {"seller_id": 3, "item": {"product_id": 4, "amount": 1, "id": 9}},
    {"seller_id": 1, "item": {"product_id": 1, "amount": 2, "id": 10}},
    {"seller_id": 3, "item": {"product_id": 3, "amount": 2, "id": 11}},
    {"seller_id": 1, "item": {"product_id": 2, "amount": 2, "id": 12}}
]

grouped = defaultdict(list)
flattened = []

for item in data:
    grouped[item['seller_id']].append(item['item'])

for k, v in grouped.items():
    flattened.append({'seller_id': k, 'list_item': v})

print(flattened)
另一个选项是使用
defaultdict
,然后使用必要的格式将其展平

不需要初步分类

另一个选项是使用
defaultdict
,然后使用必要的格式将其展平


不需要初步排序。

您的json示例在一些标签周围有多余的空格,例如
“卖方id”
“金额”
而不是
“卖方id”
“金额”
-这是故意的,也是问题的一部分吗?有
itertools.groupby
,可以解决您的问题。首先按卖家id排序,然后按卖家id分组。到目前为止,您使用了什么代码?有很多例子可以满足您的要求。这不是一个问题您的json例子在一些标签周围有多余的空格,例如
“卖方id”
“金额”
,而不是
“卖方id”
“金额”
——这是故意的,也是问题的一部分吗?有
itertools.groupby
,这会解决你的问题。首先按卖家id排序,然后按卖家id分组。到目前为止,您使用了什么代码?有很多例子可以满足您的要求。这不是一个问题Class
defaultdict
在这种情况下非常有用,可以避免需要显式测试键是否已经存在。Class
defaultdict
在这种情况下非常有用,可以避免需要显式测试键是否已经存在。下面对defaultdict进行了解释在文档中,默认命令在文档中进行了解释