matplotlib 在自定义对象列表中选择数据成员

jecbmhm3  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(148)

我定义了以下自定义类:

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

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

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

但是这有点乏味。有没有人知道一种方法可以将它合并到我的类中?或者我需要定义一个PointList类?
谢谢

iqxoj9l9

iqxoj9l91#

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

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]

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

ff29svar

ff29svar2#

您可以建立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)]) #constructor
print(points.xs()) # [4, 2]

因为它继承自list,所以所有标准列表方法都可以工作。
注意,这些都是函数。你可以让它们成为getter,在每次执行时运行,但这会增加复杂性,并使需要完成的工作变得模糊。从技术上讲,你可以存储这些列表中的每一个,并返回这些列表,但这会使添加/删除/更新点变得更加复杂(而且返回的列表是可变的)。

相关问题