【问题标题】:Select data member in list of custom objects在自定义对象列表中选择数据成员
【发布时间】:2022-11-12 19:28:17
【问题描述】:

我已经定义了以下自定义类:

class Point():
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

我有一个名为points 的Point 对象列表。 我现在需要在 3D 散点图中绘制这些点。 有没有一种快速的方法来获取我可以在类定义中实现的所有点的 x 值? 我知道我可以做到这一点

xs = [p.x for p in points]
ys = ...

但这有点乏味。有人知道在我的课堂上可能有一种方法来整合它吗? 或者也许我需要定义一个PointList 类?

谢谢

【问题讨论】:

    标签: python matplotlib python-class


    【解决方案1】:

    您可以使用 lambda 函数,也可以将其合并为映射对象的常规函数​​,如下例所示:

    class Point:
        def __init__(self, x, y, z):
            self.x = x
            self.y = y
            self.z = z
    
    
    getter = lambda points, attr: [getattr(elm, attr, None) for elm in points]
    
    ps = [Point(1, 2, 3), Point(4, 5, 6)]
    xs = getter(ps, 'x')
    print(xs)
    

    输出:

    [1, 4]
    

    PS:注意:您的 __init___ 有 3 个下划线,这不是 __init__ 函数的覆盖(带有 2 个下划线)

    【讨论】:

    • 感谢您的错字建议。
    【解决方案2】:

    您可以创建一个PointList 类。

    class PointList(list):
      def xs(self):
        return [p.x for p in self]
    
      def ys():
        return [p.y for p in self]
    
      def zs():
        return [p.z for p in self]
    

    然后你可以像这样使用它:

    points = PointList(Point(4, 5, 6), Point(2, 6, 4))
    print(points.xs()) # [4, 2]
    

    由于它继承自list,所有标准列表方法都有效。

    请注意,这些都是功能。您可以让它们在每次执行时运行,但这会增加复杂性并模糊需要完成的工作。从技术上讲,您可以存储这些列表中的每一个并返回这些列表,但这使得添加/删除/更新点变得更加复杂(并且返回的列表将是可变的)。

    【讨论】:

    • 也许您的意思是 return [p.x for p in self] ?
    • @Sala 是的,已修复
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多