#python #dictionary
#python #словарь
Вопрос:
Мой контент внутри словаря приведен ниже
Теперь мне нужно BusinessArea
узнать, сколько разных name
ключей существует, например, для этого нужно также знать обозначение
test=
[ { 'masterid': '1', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Accounting', 'parentname': 'Finance'}, { 'id': '3', 'name': 'Research', 'parentname': 'R amp; D' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' }] },
{ 'masterid': '2', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Research', 'parentname': '' }, { 'id': '3', 'name': 'Accounting', 'parentname': '' } ], 'Role': [ { 'id': '5032', 'name': 'Tester' }, { 'id': '5033', 'name': 'Developer' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' }]},
{ 'masterid': '3', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Engineering' }, { 'id': '3', 'name': 'Engineering', 'parentname': '' } ], 'Role': [ { 'id': '5032', 'name': 'Developer' }, { 'id': '5033', 'name': 'Developer', 'parentname': '' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' }]}]
Я хочу получить количество masterid бизнес-области и обозначение, которое является всеми именами
Ожидаемый результат ниже
[
{
"name": "BusinessArea",
"values": [
{
"name": "Accounting",
"count": "2"
},
{
"name": "Research",
"count": "2"
},
{
"name": "Engineering",
"count": "1"
}
]
},
{
"name": "Designation",
"values": [
{
"name": "L1",
"count": "3"
},
{
"name": "l2",
"count": "3"
}
]
}
]
Ответ №1:
Попробуйте это:
res=[{'name': 'BusinessArea', 'values': []}, {'name': 'Designation', 'values': []}]
listbus=sum([i['BusinessArea'] for i in test], [])
listdes=sum([i['Designation'] for i in test], [])
res[0]['values']=[{'name':i, 'count':0} for i in set(k['name'] for k in listbus)]
res[1]['values']=[{'name':i, 'count':0} for i in set(k['name'] for k in listdes)]
for i in listbus:
for k in range(len(res[0]['values'])):
if i['name']==res[0]['values'][k]['name']:
res[0]['values'][k]['count'] =1
for i in listdes:
for k in range(len(res[1]['values'])):
if i['name']==res[1]['values'][k]['name']:
res[1]['values'][k]['count'] =1
>>> print(res)
[{'name': 'BusinessArea', 'values': [{'name': 'Accounting', 'count': 2}, {'name': 'Research', 'count': 2}, {'name': 'Engineering', 'count': 2}]}, {'name': 'Designation', 'values': [{'name': 'L1', 'count': 3}, {'name': 'L2', 'count': 6}]}]
Комментарии:
1. Это включает повторяющиеся имена в счетчики, что отличается от ожидаемого результата.
2. Вопрос ищет уникальные «имена», но не запрашивает количество уникальных «masterid» @Nons не могли бы вы уточнить это?
3. это уникальные имена, для которых мне нужна разработка
1
. Можете ли вы также проверить ниже4. test= [ { ‘masterid’: ‘1’, ‘name’: ‘Group1’, ‘BusinessArea’: [ ‘Учет’,’Исследование’], ‘Обозначение’: [ ‘L1’ ‘L2’ ] }, { ‘masterid’: ‘2’, ‘name’: ‘Group1’, ‘BusinessArea’: [‘Research’,’Accounting’ ], ‘Role’: [ { ‘id’: ‘5032’, ‘name’: ‘Tester’ }, { ‘id’: ‘5033’, ‘name’: ‘Developer’ } ], ‘Обозначение’: [ ‘L1’ ‘L2’ ]}, { ‘masterid’: ‘3’, ‘name’: ‘Group1’, ‘BusinessArea’: [ ‘Engineering’ ], ‘Роль’: [ { ‘id’: ‘5032’, ‘name’:’Developer’ }, { ‘id’: ‘5033’, ‘name’: ‘Developer’, ‘parentname’: » } ], ‘Обозначение’: [ ‘L1’ ‘L2’ ]}]
5. можете ли вы также проверить выше, есть ли моя бизнес-область и обозначение в списке
Ответ №2:
Вы можете подсчитывать уникальные имена, используя вложенный collections.defaultdict
:
from collections import defaultdict
from json import dumps
keys = ["BusinessArea", "Designation"]
group_counts = defaultdict(lambda: defaultdict(int))
for group in test:
for key in keys:
names = [item["name"] for item in group[key]]
unique_names = list(dict.fromkeys(names))
for name in unique_names:
group_counts[key][name] = 1
print(dumps(group_counts, indent=2))
Который даст вам эти подсчеты:
{
"BusinessArea": {
"Accounting": 2,
"Research": 2,
"Engineering": 1
},
"Designation": {
"L1": 3,
"L2": 3
}
}
Затем вы можете изменить результат, чтобы получить список ожидаемых значений:
result = [
{
"name": name,
"values": [{"name": value, "count": count} for value, count in counts.items()],
}
for name, counts in group_counts.items()
]
print(dumps(result, indent=2))
Что дает вам это:
[
{
"name": "BusinessArea",
"values": [
{
"name": "Accounting",
"count": 2
},
{
"name": "Research",
"count": 2
},
{
"name": "Engineering",
"count": 1
}
]
},
{
"name": "Designation",
"values": [
{
"name": "L1",
"count": 3
},
{
"name": "L2",
"count": 3
}
]
}
]
Комментарии:
1. можете ли вы один раз проверить, является ли мой словарь list test= [ { ‘masterid’: ‘1’, ‘name’: ‘Group1’, ‘BusinessArea’: [‘Учет’,’Исследования’], ‘Обозначение’: [ ‘L1’ ‘L2’ ] }, { ‘masterid’: ‘2’, ‘name’: ‘Group1’, ‘BusinessArea’: [‘Research’,’Accounting’ ], ‘Role’: [ { ‘id’: ‘5032’, ‘name’: ‘Tester’ }, { ‘id’: ‘5033’,’name’: ‘Developer’ } ], ‘Обозначение’: [ ‘L1’ ‘L2’ ]}, { ‘masterid’: ‘3’, ‘name’: ‘Group1’, ‘BusinessArea’: [ ‘Engineering’ ], ‘Роль’: [ { ‘id’: ‘5032’, ‘name’: ‘Developer’ }, { ‘id’: ‘5033’, ‘name’: ‘Developer’, ‘parentname’: » } ], ‘Обозначение’: [ ‘L1’ ‘L2’ ]}]