Коллекции Python неосновного типа? - PullRequest
2 голосов
/ 14 января 2011

Я изучаю Python, и меня немного смущает вопрос, для чего используются различные структуры данных, такие как список, кортежи, словари, наборы.

Например, скажем, автомобили определяются по марке, модели, лошадиным силам
Я хотел бы иметь коллекцию автомобилей, на которых я мог бы

  • сортировка по лошадиным силам или марке
  • сравнить по модели (чтобы удалить дубликаты)
  • иеррируйте просто с оператором for
  • удаление элементов по модели

Каков наилучший способ достичь этого?

  • Нужно ли создавать класс Car и заново определять некоторые функции (например, операторы == и> в C), а затем сохранять их в списке
  • Или я должен сделать их словарным или самому заново определить словарь? а затем попросите Python отсортировать их для меня (я думаю, что это возможно с операторским модулем, поправьте меня, если я ошибаюсь)
  • что-то еще?

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Как и большинство вещей, существует более одного возможного подхода.

Использование класса

Вероятно, самым лучшим будет создать класс Car.Вам не нужно переопределять операторы - просто имейте некоторые свойства и конструктор.

class Car:
    def __init__(self, brand, model, hp):
        self.brand = brand
        self.model = model
        self.hp = hp

Тогда, если вы хотите сравнить по модели:

car1 = Car('foo', 'bar', 23)
car2 = Car('baz', 'bar', 34)

if car1.model == car2.model:
    # models are equal

Если у вас был списокиз Car объектов, и хотел отсортировать их по лошадиным силам:

car1 = Car('foo', 'bar', 23)
car2 = Car('baz', 'bar', 34)
car3 = Car('baz', 'bar', 14)
car_list = [car1, car2, car3]

car_list.sort(key=lambda c: c.hp)

Использование dict

Конечно, поскольку все, что вы будете делать с классом, это хранить наборсвойства, вы могли бы просто использовать вместо этого диктовку - вы просто теряете жесткость (и получаете некоторую гибкость).Для имитации приведенного выше кода, но с диктовками:

{'brand': 'foo', 'model': 'bar', 'hp': 23}

Затем, если вы хотите сравнить по модели:

car1 = {'brand': 'foo', 'model': 'bar', 'hp': 23}
car2 = {'brand': 'baz', 'model': 'bar', 'hp': 34}

if car1['model'] == car2['model']:
    # models are equal

Если у вас был список Car объектовхотел отсортировать их по лошадиным силам:

car1 = {'brand': 'foo', 'model': 'bar', 'hp': 23}
car2 = {'brand': 'baz', 'model': 'bar', 'hp': 34}
car2 = {'brand': 'baz', 'model': 'bar', 'hp': 14}
car_list = [car1, car2, car3]

car_list.sort(key=lambda c: c['hp'])
0 голосов
/ 14 января 2011

Я бы сделал это с классом Car и dict (модель: Car) для хранения разных автомобилей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...