Сортировка значения вложенного списка с использованием значения словаря

#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)
]
 
  1. Создайте словарь, в котором вы можете хранить свои списки как значения, а метки имен как ключи. Чтобы заполнить словарь, выполните итерацию по списку списков, а затем по словарям в соответствующем списке. Найдите словарь, содержащий метку имени, и добавьте метку и список в словарь.
  2. Затем вы можете отсортировать ключи / метки словаря, а затем перебирать отсортированные ключи и извлекать свои списки в отсортированном порядке.

Ответ №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))