【问题标题】:Python collections of non-base type?非基本类型的 Python 集合?
【发布时间】:2011-01-14 09:56:33
【问题描述】:

我正在学习 python,我有点困惑不同数据结构(如列表、元组、字典、集合)的用途。

例如,假设汽车由品牌、型号、马力定义
我希望有一些我可以乘坐的汽车

  • 按马力或品牌排序
  • 按型号比较(删除重复项)
  • 只需使用 for 语句进行迭代
  • 按模型删除元素

实现这一目标的最佳方法是什么?

  • 我是否需要创建一个 Car 类,并重新定义一些函数(如 C 中的运算符 == 和 >),然后将它们存储在一个列表中
  • 或者我应该将它们制作成字典,还是自己重新定义字典?然后让 python 为我排序(我认为操作员模块可以做到这一点,如果我错了,请纠正我)
  • 还有别的吗?

【问题讨论】:

    标签: python collections


    【解决方案1】:

    像大多数事情一样,有不止一种可能的方法。

    使用类

    最简洁的方法可能是创建一个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)
    

    使用字典

    当然,由于您对类所做的只是存储一组属性,因此您也可以只使用 dicts 代替 - 您只是失去了刚性(并获得了一些灵活性)。模仿上面的代码,但使用 dicts:

    {'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'])
    

    【讨论】:

    • 使用 Car 类和列表有效,但不适用于所有列表函数:使用您的示例: >>> 在 car_list 中打印 car1
      True >>> carSought=Car('foo',' bar',23) >>> carSought in car_list False
    • 对,因为对象的in 使用__hash__ (iirc),默认情况下它基于对象的引用。你可以定义一个自定义的__hash__,如果你想要它只是基于某些属性,这样对于这些属性具有相同值的任何两个实例都将具有相同的哈希值(因此如果有任何引用,则被视为in一个列表相同的对象)。
    • 认为我得到了这个工作,还为汽车类定义了一个自定义的__eq__ 方法!希望这不会引发一些副作用。感谢您的帮助琥珀!
    【解决方案2】:

    我会使用 Car 类和 dict(model:Car) 存储不同的汽车。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 2019-12-05
      • 2010-10-07
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多