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分组。到目前为止,您使用了什么代码?有很多例子可以满足您的要求。这不是一个问题Classdefaultdict
在这种情况下非常有用,可以避免需要显式测试键是否已经存在。Classdefaultdict
在这种情况下非常有用,可以避免需要显式测试键是否已经存在。下面对defaultdict进行了解释在文档中,默认命令在文档中进行了解释