Как объединять и сортировать объекты 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})
Вернуться на верх