繁体   English   中英

这种字典排序有什么问题?

[英]What is wrong with this sorting of dictionary?

我正在尝试在这里对字典进行排序:

car =   {
  "brand": ["Ford","Honda","Toyota","Tesla","Ford"],
  "model": ["Mustang","CRV","RAV4","X","Transit"],
  "year": [1964,2010,2015,2022,1964],
  "color": ["Red","Yellow","Green","Blue","Black"]
}

sortedbyval1={k: v for k, v in sorted(car.items(),key=lambda v:v[1])}

它不起作用,因为您有一堆汽车属性的字典,而不是汽车的集合。 这就是为什么当您使用key=lambda v:v[1]<\/code>时, sorted<\/code>会尝试比较包含不同类型的列表。 例如,“year”仅包含 int,但您想将其与包含字符串的“brand”进行比较,因此您会得到 TypeError。

您可以修改该字典以创建汽车列表。 假设相同的索引值对应于同一辆车,您可以遍历zip<\/code> ped car.values()<\/code>并使用 dict 构造函数创建一个字典列表,其中每个字典都是一辆车。

然后使用list.sort<\/code> ,其中排序键是按型号、年份和颜色对汽车列表进行排序。

list_of_cars = [dict(zip(car.keys(), tpl)) for tpl in zip(*car.values())]
list_of_cars.sort(key=lambda car: (car['model'], car['year'], car['color']))

试试这个美:

car = {
  "brand": [ "Ford", "Honda", "Toyota", "Tesla", "Ford" ],
  "model": [ "Mustang", "CRV", "RAV4", "X", "Transit" ],
  "year":  [ 1964, 2010, 2015, 2022, 1964 ],
  "color": [ "Red", "Yellow", "Green", "Blue", "Black" ]
}

criteria = "model";

sorted_dict = {
    k: v for k, v in [
        (a, [
            car[a][b] for b in [
                c for (c, _) in sorted(
                    zip(
                        [
                            c for c in range(0, len(car[criteria]) )
                        ], 
                        car[criteria]
                    ), 
                    key = lambda x: x[1]
                )
            ]
        ]) for a in car.keys()
    ]
};

print(sorted_dict)

这不是您直接要求的,但是由于您正在学习 python,因此可能会提到在这种情况下使用类和面向对象编程的简洁方式:

class car():

    def __init__(self, brand, model, year, color):
        self.brand = brand
        self.model = model
        self.year = year
        self.color = color


cars = [car("Ford", "Mustang", 1964, "Red"),
        car("Honda", "CRV", 2010, "Yellow"),
        car("Toyota", "RAV4", 2015, "Green"),
        car("Tesla", "X", 2022, "Blue"),
        car("Ford", "Transit", 1964, "Black")]

cars.sort(key=lambda c: c.year)

for c in cars:
    print(c.year, c.model, c.brand)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM