#python #python-3.x
#python #python-3.x
Вопрос:
У меня есть словарь вложенных списков. Мне нужно отсортировать список (список верхнего уровня) по внутреннему словарю, когда он соответствует метке и по значению в python. Например, я хочу отсортировать список, где («label» == «Name» и по значению ключа «value» внутреннего словаря), вот мой словарь,
[
[
{
"propertyId": 1,
"fieldName": "Name",
"value": "mahir contact 1",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "name",
"label": "Name",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "string",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.248107"
},
{
"propertyId": 2,
"fieldName": "Email",
"value": "mahir_contact_1@gmail.com",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "email",
"label": "Email",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "email",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.253318"
},
{
"propertyId": 6,
"fieldName": "Contact creation date",
"value": "2020-11-24 05:57:01.216359",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactCreationDate",
"label": "Contact creation date",
"description": "default properties by roboket",
"fieldType": "Date picker",
"fieldDataType": "datetime",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": false,
"hasOptions": false,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.256631"
},
{
"propertyId": 11,
"fieldName": "Contact owner",
"value": "1",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactOwner",
"label": "Contact owner",
"description": "default properties by roboket",
"fieldType": "Dropdown select",
"fieldDataType": "select",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": true,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.261312"
}
],
[
{
"propertyId": 3,
"fieldName": "Phone number",
"value": " 8801517179498",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "phoneNumber",
"label": "Phone number",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "number",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.115570"
},
{
"propertyId": 6,
"fieldName": "Contact creation date",
"value": "2020-11-24 05:58:04.070069",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactCreationDate",
"label": "Contact creation date",
"description": "default properties by roboket",
"fieldType": "Date picker",
"fieldDataType": "datetime",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": false,
"hasOptions": false,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.122804"
},
{
"propertyId": 11,
"fieldName": "Contact owner",
"value": "1",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactOwner",
"label": "Contact owner",
"description": "default properties by roboket",
"fieldType": "Dropdown select",
"fieldDataType": "select",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": true,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.130811"
},
{
"propertyId": 1,
"fieldName": "Name",
"value": "mahir contact 2",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "name",
"label": "Name",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "string",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.111468"
}
]
]
Мой ожидаемый результат:
[
[
{
"propertyId": 3,
"fieldName": "Phone number",
"value": " 8801517179498",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "phoneNumber",
"label": "Phone number",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "number",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.115570"
},
{
"propertyId": 6,
"fieldName": "Contact creation date",
"value": "2020-11-24 05:58:04.070069",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactCreationDate",
"label": "Contact creation date",
"description": "default properties by roboket",
"fieldType": "Date picker",
"fieldDataType": "datetime",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": false,
"hasOptions": false,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.122804"
},
{
"propertyId": 11,
"fieldName": "Contact owner",
"value": "1",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactOwner",
"label": "Contact owner",
"description": "default properties by roboket",
"fieldType": "Dropdown select",
"fieldDataType": "select",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": true,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.130811"
},
{
"propertyId": 1,
"fieldName": "Name",
"value": "mahir contact 2",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "name",
"label": "Name",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "string",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 2,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:58:04.111468"
}
],
[
{
"propertyId": 1,
"fieldName": "Name",
"value": "mahir contact 1",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "name",
"label": "Name",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "string",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.248107"
},
{
"propertyId": 2,
"fieldName": "Email",
"value": "mahir_contact_1@gmail.com",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "email",
"label": "Email",
"description": "default properties by roboket",
"fieldType": "Single line text",
"fieldDataType": "email",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": false,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.253318"
},
{
"propertyId": 6,
"fieldName": "Contact creation date",
"value": "2020-11-24 05:57:01.216359",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactCreationDate",
"label": "Contact creation date",
"description": "default properties by roboket",
"fieldType": "Date picker",
"fieldDataType": "datetime",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": false,
"hasOptions": false,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.256631"
},
{
"propertyId": 11,
"fieldName": "Contact owner",
"value": "1",
"objectTypeName": "Contact properties",
"groupName": "Contact information",
"name": "contactOwner",
"label": "Contact owner",
"description": "default properties by roboket",
"fieldType": "Dropdown select",
"fieldDataType": "select",
"propertyOwnerId": null,
"propertyOwnerAccountId": 1,
"default": true,
"hasOptions": true,
"id": 1,
"contactCreatorId": 1,
"contactOwnerId": 1,
"createdAt": "2020-11-24T05:57:01.261312"
}
]
]
Заранее спасибо за вашу помощь.
Комментарии:
1. Можете ли вы обновить свой вопрос предпочтительным выводом на основе вашего примера? Также есть ли что-нибудь, что вы пробовали до сих пор?
2. Да, я попробовал, отсортировал (all_contact_data_response, ключ = лямбда k: k[«значение»] и k [«метка»] ==property_name) . Но мне нужно пройти еще один уровень.
Ответ №1:
Я бы предложил следующее двухэтапное решение вашей проблемы:
import json
with open("test.json") as json_file:
data = json.load(json_file)
labeled_contacts = {}
for contact_props in data:
for contact_prop in contact_props:
if contact_prop["label"] == "Name":
labeled_contacts[contact_prop["value"]] = contact_props
sorted_contacts = [
labeled_contacts[label] for label in sorted(labeled_contacts.keys(), reverse=True)
]
- Создайте словарь, в котором вы можете хранить свои списки как значения, а метки имен как ключи. Чтобы заполнить словарь, выполните итерацию по списку списков, а затем по словарям в соответствующем списке. Найдите словарь, содержащий метку имени, и добавьте метку и список в словарь.
- Затем вы можете отсортировать ключи / метки словаря, а затем перебирать отсортированные ключи и извлекать свои списки в отсортированном порядке.
Ответ №2:
Если это — sorted(all_contact_data_response, key=lambda k: k["value"] and k["label"]==property_name)
— работает, попробуйте повысить уровень [ sorted(all_contact_data_response, key=lambda k: k["value"] and k["label"]==property_name),]
Однако, я не знаю, что у вас есть в переменной all_contact_data_response
Ответ №3:
моя идея состоит в том, чтобы извлечь value
ключ из внутреннего словаря и добавить его во внешний список в качестве временной переменной.
# data contains the JSON as a dictionary.
for idx1, item1 in enumerate(data):
value = None
for idx2, item2 in enumerate(item1):
if item2["label"] == "Name":
value = item2["value"]
break
data[idx1].append(value)
Теперь, когда у нас есть это значение во внешней области, мы можем легко использовать его для сортировки списка.
result = sorted(data, key=lambda i: i[-1])
Далее по строке вы можете удалить дополнительную переменную.
for item in result:
item.pop(-1)
Ответ №4:
ОК. если я правильно понимаю проблему, попробуйте следующее
def foo(list_item):
for a in list_item:
if a['label'] == 'Name':
return a['value']
res = sorted(all_contact_data_response, reverse=True, key = lambda list_item: foo(list_item))