如何通过密钥对复杂字典进行排序,该密钥位于字典深处?

use*_*027 1 python sorting dictionary list

我有一个这种结构的字典:

{
  "Mark":
  {
    "surname":"Johnson",
    "tags":
    [
      {
        "name":"Salary",
        "value":"5"
      },
      {
        "name":"Car manufacturer",
        "value":"Volvo"
      }
    ]
  },
  "John":
  {
    "surname":"Doe",
    "tags":
    [
      {
        "name":"Salary",
        "value":"10"
      },
      {
        "name":"Car manufacturer",
        "value":"Daewoo"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我想通过名称为'汽车制造商'的标签值对该字典进行排序,以得到这样的结果:

{
  "Volvo": 
  {
    [
     "Mark":{...},...
    ]
  },
  "Daewoo":
  {
    ["John":{...}]
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让它尽可能优雅?我可以通过制作几个嵌套循环(下面的例子)来做到这一点,但它看起来很难看,可能效率不高.

cars = {}
for person in persons:
  for tag in person['tags']:
    if tag['name'] == 'Car manufacturer'
      cars[tag['value']].append(item)
Run Code Online (Sandbox Code Playgroud)

pyp*_*ypy 6

老实说,您的起始数据结构设计非常糟糕.它可能会小规模地工作,但随着你的进步和你的"字典"项目变得越来越大,你已经可以看到它快速结束了.尝试改为创建一个类,并创建结构的不同实例.例如:

class Employees():
    def __init__(self):
        self.surname = ''
        self.salary = 0
        self.car_man = []  # if in case you want to add more than one car use a list type or just use string if you plan on keeping this a single value
Run Code Online (Sandbox Code Playgroud)

从这里你可以创建实例,你将能够更容易地跟踪它们.您甚至可以将这些单独的实例添加到字典本身,然后您可以对它们进行排序.

EX:

 Mark = Employees()
 Mark.surname = 'Johnson'
 Mark.salary = 5
 Mark.car_man = 'Volvo'

 John = Employees()
 John.surname = "Doe"
 John.salary = 10
 John.car_man = Daewoo
Run Code Online (Sandbox Code Playgroud)

根据需要为这些实例添加这些实例,然后您可以将这些实例添加到字典中,并且能够更轻松地对它们进行排序.

将它们添加到字典就像这样简单:

my_dict = {}
my_dict[#key] = # your instance
Run Code Online (Sandbox Code Playgroud)