Как объединять и сортировать объекты JSON, используя их подсчеты?
У меня есть два json-объекта, которые мне нужно объединить вместе на основе ID.
вот первый комментарий объекта:
и вот второй объект:
{
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui 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 iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
},
{
"userId": 1,
"id": 4,
"title": "eum et est occaecati",
"body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis 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 eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis 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 numquam\net omnis occaecati quod ullam at\nvoluptatem error expedita pariatur\nnihil sint nostrum voluptatem reiciendis et"
},
{
"postId": 1,
"id": 3,
"name": "odio adipisci rerum aut animi",
"email": "Nikita@garfield.biz",
"body": "quia molestiae reprehenderit quasi aspernatur\naut expedita occaecati aliquam eveniet laudantium\nomnis quibusdam delectus saepe quia accusamus maiores nam est\ncum et ducimus et vero voluptates excepturi deleniti ratione"
},
{
"postId": 1,
"id": 4,
"name": "alias odio sit",
"email": "Lew@alysha.tv",
"body": "non et atque\noccaecati deserunt quas accusantium unde odit nobis qui voluptatem\nquia voluptas consequuntur itaque dolor\net 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 praesentium\naccusamus fugiat dicta\nvoluptatem rerum ut voluptate autem\nvoluptatem 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 et\nquasi temporibus esse sunt id et\neos voluptatem aliquam\naliquid ratione corporis molestiae mollitia quia et magnam dolor"
},
}
Объект один - это в основном посты с информацией о постерах, а объект два - это комментарии с информацией о комментаторах. Поэтому ожидается, что объект один имеет отношения один ко многим со вторым объектом. например, один пост имеет много комментариев. это отношение основано на id в объекте один является postId в объекте два. конечная цель состоит в том, чтобы подсчитать и отсортировать посты по количеству комментариев.
с помощью простых циклов for мне удалось объединить их вместе, но я не знаю, как правильно подсчитать и отсортировать их.
for i in posts:
if (id==postId):
newobj.append(objtwo[i])
count+=1
else:
newobj.append(count)
count=0
можно ли это сделать? Обычно я использую django ORM, чтобы разобраться с этим, но у меня нет доступа к базе данных и модели таблицы.
Предполагая, что ваши структуры данных posts
и comments
представляют собой списки, вы можете использовать python's 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
# sort the posts based on the counts collected
posts.sort(key=lambda post: comments_per_post[post['id']], reverse=True)
# print them to verify
print(json.dumps(posts, indent=2))
Примечание: это сортирует массив posts
на месте. Если вам это не нужно, вы можете использовать sorted_posts = sorted(posts, key=...
вместо этого.
Мой ответ очень похож на ответ Byted.
Я бы использовал Counter
из встроенного collections
для подсчета количества postIds
во втором объекте.
Затем отсортируйте первый объект, используя эти подсчеты из предыдущего шага в качестве ключа сортировки. Объект Counter возвращает 0, если в нем нет ключа, поэтому просто используйте его в качестве ключа сортировки. Отрицательный знак обеспечивает нисходящий порядок (потому что sorted()
по умолчанию сортирует по возрастанию).
import json
from collections import Counter
counts = Counter([d['postId'] for d in objtwo])
json.dumps(sorted(objone, key=lambda x: -counts[x['id']]), indent=4)
Промежуточный выход для этого входа:
print(counts)
# Counter({1: 4, 2: 2})