Перебирать отсортированный вложенный словарь в Python - PullRequest
0 голосов
/ 19 февраля 2019

Я сталкиваюсь с проблемами при переборе отсортированного вложенного словаря.Под вложенным словарем я подразумеваю словарь, который содержит другие словари, подобные этому:

{"A": 
    {"subA": {"Date": ["date1", "date2"],
              "numDownloads": [int1, int2]}
     "subB": {"Date": ["date3", "date4"],
              "numDownloads": [int3, int4]}
    }
 "B":
    {"subC": {"Date": ["date5", "date6"],
              "numDownloads": [int5, int6]}
     "subD": {"Date": ["date7", "date8"],
              "numDownloads": [int7, int8]}
    }
}

Я хотел бы выполнить итерацию для каждого ключа первого уровня (в данном случае A и B) на ключах второго уровня (subA, subB для A и subC, subD для B), отсортированные по первому значению numDownloads по возрастанию (int1, int 3 для A и int 5, int 7 для B).

Если я приведу пример того, чтоЯ хочу: Рассмотрим этот словарь:

{"A": 
    {"subA": {"Date": ["date1", "date2"],
              "numDownloads": [100, 500]}
     "subB": {"Date": ["date3", "date4"],
              "numDownloads": [500, 1000]}
    }
 "B":
    {"subC": {"Date": ["date5", "date6"],
              "numDownloads": [10000, 50000]}
     "subD": {"Date": ["date7", "date8"],
              "numDownloads": [500, 1000]}
    }
}

Я хотел бы итерировать, хотя A с subA, а затем subB, так как значение subA первое numDownloads (100) ниже, чем первое значение subB numDownloads (500), и хотя B с subDзатем subC и subC первое значение numDownloads (10000) больше, чем subD первое значение numDownloads (500).

Я пытался использовать функцию sorted () и лямбда-выражение, но не могузаставить это работать для моего случая.

for firstKey in myDict:
    firstKeyData = myDict[firstKey]
    for key in sorted(firstKeyData, key=lambda k: firstKeyData[k]["numDownloads"][0]):
        // here, sub keys are sorted according to the first element of numDownloads 
        // A : subA then subB
        // B : subD then subC

Вот пример файла json:

{
   "Social":{
      "Facebook":{
         "Date":[
            "2019-02-19"
         ],
         "numDownloads":[
            "100000000"
         ]
      },
      "Twitter":{
         "Date":[
            "2019-02-19"
         ],
         "numDownloads":[
            "100000"
         ]
      }
   },
   "Instagram":{
      "Date":[
         "2019-02-19"
      ],
      "numDownloads":[
         "5000"
      ]
   },
   "Communication":{
      "Messenger":{
         "Date":[
            "2019-02-19"
         ],
         "numDownloads":[
            "100000"
         ]
      },
      "Whatsapp":{
         "Date":[
            "2019-02-19"
         ],
         "numDownloads":[
            "50000000"
         ]
      }
   }
}

Спасибо всем

1 Ответ

0 голосов
/ 19 февраля 2019

Ключи numDownloads вашего фактического файла JSON содержат строки, а не целые числа, как это предлагается в упрощенной версии ваших примеров данных, поэтому сравнение выполняется лексикографически, а не численно, когда вы делаете это возвращаемое значение вашей ключевой функции длясортировка, поэтому "20" будет считаться «больше», чем, например, "100".

Вместо этого вы должны преобразовать ссылочные элементы в целые числа:

for key in sorted(firstKeyData, key=lambda k: int(firstKeyData[k]["numDownloads"][0])):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...