Разделить список объектов по атрибутам объекта - PullRequest
0 голосов
/ 18 апреля 2020

Я не могу понять, как разбить список объектов по значению объекта. Например:

class car:
    cid=0
    type="undef"

    def  __init__(self, cid,type):
        self.cid=cid
        self.type=type

    def show(self):
        print("car id : "+str(self.cid)+" car type : "+self.type)

car_list=[]
car_list.append(car(34,"Suv"))
car_list.append(car(47,"Suv"))
car_list.append(car(48,"Suv"))
car_list.append(car(42,"hb"))
car_list.append(car(40,"hb"))
car_list.append(car(37,"sed"))
car_list.append(car(77,"sed"))
car_list.append(car(22,"sed"))

Я хочу разбить car_list на список автомобилей каждого типа. Затем распечатайте тип автомобиля перед списком. Ожидаемый результат:

SUV
==========================
car id : 34 car type : Suv
car id : 47 car type : Suv
car id : 47 car type : Suv
HB
==========================
car id : 47 car type : hb
car id : 47 car type : hb
SED
==========================
car id : 47 car type : sed
car id : 47 car type : sed
car id : 47 car type : sed

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Разобрался:

from collections import groupby 
grouped_car_list= groupby(car_list, key = lambda car : car.type)

for  type , cars in grouped_car_list:
    print(type)
    print("=============================")
    for car in cars:
        car.show()
0 голосов
/ 18 апреля 2020

U может сначала создать список типа, например types = ['SUV', 'HB', 'SED'], или выполнить поиск типа из списка с циклом:

types = []
for car in car_list:
    if not car.type in types:
        types.append(car.type)

Last, l oop снова, чтобы получить тот же тип:

for type in types:
    print(type.upper())
    for car in car_list:
        if car.type.lower() == type.lower():
            car.show()

...