Я работаю с python3, где у меня есть список словарей - PullRequest
0 голосов
/ 25 августа 2018

У меня есть следующий список словарей, который содержит имя задания, количество и название города

question = [{
        "count": 2,
        "city": "Pune",
        "job_NAME": "clerk"
    }, {
        "count": 1,
        "city": "kolkata",
        "job_NAME": "manager"
    }, {
        "count": 2,
        "city": "Mumbai",
        "job_NAME": "accountant"
    }, {
        "count": 1,
        "city": "New Delhi",
        "job_NAME": "clerk"
    }]

что мне нужно, если job_name одно и то же, в этом случае "клерк", число и город должны быть в одном списке под ключом "jobs"

   answer = [{
    "job_name": "clerk",
    "jobs": [{
        "city": "pune",
        "count": 2
    }, {
        "city": "New Delhi",
        "count": 1
    }]
}, {
    "job_name": "manager",
    "jobs": [{
        "city": "kolkata",
        "count": 1
    }]
}, {
    "job_name": "accountant",
    "jobs": [{
        "city": "Mumbai",
        "count": 2
    }]
}]

если в списке вопросов есть какой-либо профиль задания, дублирующий его, в этом случае следует указать его город, и его количество должно быть добавлено в список "заданий".

Буду очень признателен за любую помощь!

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Я использую defaultdict(list), чтобы сначала сгруппировать записи из списка ввода, а затем во второй итерации я устанавливаю результат:

from collections import defaultdict

groups = defaultdict(list)

for jobs in question:
    job_name = jobs["job_NAME"]
    del jobs["job_NAME"]
    groups[job_name].append(jobs)

answer = [
    dict(job_name=job_name, jobs=jobs) for job_name, jobs in groups.items()
]

# alternative with classic loop
answer = []
for job_name, jobs in groups.items():
    answer.append(dict(job_name=job_name, jobs=jobs))
0 голосов
/ 25 августа 2018

One-вкладыш:

from itertools import groupby
from operator import itemgetter

answer = [{'job_name': k, 'jobs': [{f: v for f, v in d.items() if f != 'job_NAME'} for d in g]} 
          for k, g in groupby(sorted(question, key=itemgetter('job_NAME')), key=itemgetter('job_NAME'))]

Результат:

[{'job_name': 'accountant', 'jobs': [{'count': 2, 'city': 'Mumbai'}]},
 {'job_name': 'clerk',
  'jobs': [{'count': 2, 'city': 'Pune'}, {'count': 1, 'city': 'New Delhi'}]},
 {'job_name': 'manager', 'jobs': [{'count': 1, 'city': 'kolkata'}]}]

Сортируйте и группируйте question по job_NAME, а затем просто создайте ответ как список диктов с job_name и jobs.

0 голосов
/ 25 августа 2018

Использование collections.defaultdict

Ex:

from collections import defaultdict

d = defaultdict(list)
question = [{'count': 2, 'city': 'Pune', 'job_NAME': 'clerk'}, {'count': 1, 'city': 'kolkata', 'job_NAME': 'manager'}, {'count': 2, 'city': 'Mumbai', 'job_NAME': 'accountant'}, {'count': 1, 'city': 'New Delhi', 'job_NAME': 'clerk'}]

for i in question:
    d[i["job_NAME"]].append({"city": i["city"], "count": i["count"]})

answer = [{"job_name": k, "jobs": v} for k, v in d.items()]
print(answer)

Выход:

[{'job_name': 'clerk',
  'jobs': [{'city': 'Pune', 'count': 2}, {'city': 'New Delhi', 'count': 1}]},
 {'job_name': 'accountant', 'jobs': [{'city': 'Mumbai', 'count': 2}]},
 {'job_name': 'manager', 'jobs': [{'city': 'kolkata', 'count': 1}]}]
...