我如何合并和排序JSON对象使用它的计数?



我有两个json对象,我需要根据ID组合在一起,并对其进行计数和排序操作。

这是第一个对象注释:

[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipitnsuscipit recusandae consequuntur expedita et cumnreprehenderit molestiae ut ut quas totamnnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitaensequi sint nihil reprehenderit dolor beatae ea dolores nequenfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendisnqui aperiam non debitis possimus qui neque nisi nulla"
},
{
"userId": 1,
"id": 3,
"title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
"body": "et iusto sed quo iurenvoluptatem occaecati omnis eligendi aut adnvoluptatem doloribus vel accusantium quis pariaturnmolestiae porro eius odio et labore et velit aut"
},
{
"userId": 1,
"id": 4,
"title": "eum et est occaecati",
"body": "ullam et saepe reiciendis voluptatem adipiscinsit amet autem assumenda provident rerum culpanquis hic commodi nesciunt rem tenetur doloremque ipsam iurenquis sunt voluptatem rerum illo velit"
},
]

第二个json对象:

[
{
"postId": 1,
"id": 1,
"name": "id labore ex et quam laborum",
"email": "Eliseo@gardner.biz",
"body": "laudantium enim quasi est quidem magnam voluptate ipsam eosntempora quo necessitatibusndolor quam autem quasinreiciendis et nam sapiente accusantium"
},
{
"postId": 1,
"id": 2,
"name": "quo vero reiciendis velit similique earum",
"email": "Jayne_Kuhic@sydney.com",
"body": "est natus enim nihil est dolore omnis voluptatem numquamnet omnis occaecati quod ullam atnvoluptatem error expedita pariaturnnihil sint nostrum voluptatem reiciendis et"
},
{
"postId": 1,
"id": 3,
"name": "odio adipisci rerum aut animi",
"email": "Nikita@garfield.biz",
"body": "quia molestiae reprehenderit quasi aspernaturnaut expedita occaecati aliquam eveniet laudantiumnomnis quibusdam delectus saepe quia accusamus maiores nam estncum et ducimus et vero voluptates excepturi deleniti ratione"
},
{
"postId": 1,
"id": 4,
"name": "alias odio sit",
"email": "Lew@alysha.tv",
"body": "non et atquenoccaecati deserunt quas accusantium unde odit nobis qui voluptatemnquia voluptas consequuntur itaque dolornet qui rerum deleniti ut occaecati"
},
{
"postId": 2,
"id": 5,
"name": "et fugit eligendi deleniti quidem qui sint nihil autem",
"email": "Presley.Mueller@myrl.com",
"body": "doloribus at sed quis culpa deserunt consectetur qui praesentiumnaccusamus fugiat dictanvoluptatem rerum ut voluptate autemnvoluptatem repellendus aspernatur dolorem in"
},
{
"postId": 2,
"id": 6,
"name": "repellat consequatur praesentium vel minus molestias voluptatum",
"email": "Dallas@ole.me",
"body": "maiores sed dolores similique labore et inventore etnquasi temporibus esse sunt id etneos voluptatem aliquamnaliquid ratione corporis molestiae mollitia quia et magnam dolor"
},
]

对象一基本上是带有发布者详细信息的帖子,对象二是带有评论者详细信息的评论。

期望对象1与第二个对象有一对多关系。例如,一个帖子有很多评论。这个关系是基于对象1中的id和对象2中的postId。最终目标是计数按评论数发布。

我尝试用简单的for循环和创建新的json对象来解决问题,我设法将它们组合在一起,但我不知道如何正确地计数和排序它们。

:

for i in posts:
if (id==postId):
newobj.append(objtwo[i])
count+=1
else:
newobj.append(count)
count=0

通常我使用django ORM来排序,但我不能访问表的数据库和模型。如何计数和排序的新对象,使它可以返回与大多数评论计数的帖子列表,并下降到较低的评论计数?

假设您的postscomments数据结构是列表,您可以使用python的defaultdict来计算注释。然后,使用posts.sort(key=...)根据使用key参数收集的计数对帖子进行排序。总的来说,它可能像这样:

import json
from collections import defaultdict
posts = [ ... ]
comments = [ ... ]
# data structure to count the to comments
# automatically initializes to 0
comments_per_post = defaultdict(int)
# iterate through the comments to increase the count for the posts
for comment in comments:
comments_per_post[comment['postId']] += 1
# add comment count to post
for post in posts:
post['number_of_comments'] = comments_per_post[post['id']]
# sort the posts based on the counts collected
posts.sort(key=lambda post: post['number_of_comments'], reverse=True)
# print them to verify
# number of comments per Post will be in the `number_of_comments` key on the post dict.
print(json.dumps(posts, indent=2))

注意:这将对posts数组进行排序。如果您不希望这样做,您可以使用sorted_posts = sorted(posts, key=...

我的回答与Byted的回答非常相似。

我将使用内置collections中的Counter来计算第二个对象中postIds的数量。

然后使用前一步中的计数作为排序键对第一个对象进行排序。如果一个键不存在,Counter对象返回0,所以只使用它作为查找作为排序键。负号确保降序排序(因为sorted()默认按升序排序)。

import json
from collections import Counter
# count the comments
counts = Counter([d['postId'] for d in objtwo])
# add the counts to each post
for d in objone:
d["number of comments"] = counts[d['id']]
# sort posts by number of comments in descending order
objone.sort(key=lambda x: -x['number of comments'])
# convert to json
json.dumps(objone, indent=4)

该输入的中间输出:

print(counts)
# Counter({1: 4, 2: 2})

最新更新