python从对象列表中获取特定属性

2024-10-01 15:41:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python对象数组

class ball(self, size, color, name):
  self.size = size
  self.color = color
  self.name = name

然后用户将通过命令行输入名称和属性。例如,用户可以输入“name1”然后输入“color”或者“weirdName”然后输入“size”。。。然后我想根据名称找到对象,然后打印得到颜色对象或大小对象。我能这样做吗?还是我需要用开关箱?你知道吗

谢谢


Tags: 对象命令行用户nameself名称size属性
3条回答

如果我理解正确,您需要根据属性的值从球列表中获取特定的球。解决办法是:

attribute_value = sys.argv[1]
attribute_name = sys.argv[2]
matching_balls = [ball_item for ball_item in list_balls if \
     getattr(ball_item, attribute_name) == attribute_value]

我想你在尝试做两件不同的事。你知道吗

首先,你想得到一个特定的球的名字。为此,格尼布勒已经给了你答案。你知道吗

然后,您需要按名称获取球的一个属性。为此,请使用^{}

the_ball = next(b for b in list_of_balls if b.name == sys.argv[1])
the_value = getattr(the_ball, sys.argv[2])
print('ball {}.{} == {}'.format(sys.argv[1], sys.argv[2], the_value)

此外,您的class定义错误:

class ball(self, size, color, name):
  self.size = size
  self.color = color
  self.name = name

您可能希望它是ball类中的__init__方法,而不是class定义本身:

class ball(object):
  def __init__(self, size, color, name):
    self.size = size
    self.color = color
    self.name = name

但是,您可能需要重新考虑您的设计。如果按名称动态访问属性的频率高于直接访问属性的频率,那么只存储dict通常更好。例如:

class Ball(object):
    def __init__(self, size, color, name):
        self.name = name
        self.ball_props = {'size': size, 'color': color}

list_of_balls = [Ball(10, 'red', 'Fred'), Ball(20, 'blue', 'Frank')]

the_ball = next(b for b in list_of_balls if b.name == sys.argv[1])
the_value = the_ball.ball_props[sys.argv[2]]

或者您甚至可能想从dictcollections.MutableMapping或其他任何地方继承,因此您可以执行以下操作:

the_value = the_ball[sys.argv[2]]

此外,您可能需要考虑使用按名称键入的球的dict,而不是列表:

dict_of_balls = {'Fred': Ball(10, 'red', 'Fred'), …}
# ...

the_ball = dict_of_balls[sys.argv[1]]

如果已经构建了list,那么可以很容易地从它构建dict

dict_of_balls = {ball.name: ball for ball in list_of_balls}

如果你知道只有一个匹配,你可以这样做:

the_ball = next(b for b in list_of_balls if b.name == ???)

如果有多个,则可以得到一个列表:

the_balls = [b for b in list_of_balls if b.name == ???]

如果你主要是根据球的名字来查找球,你应该把它们放在字典里而不是列表里

要按名称检索属性,请使用getattr

getattr(the_ball, "size")

这样做可能是个坏主意

getattr(the_ball, user_input)

如果用户输入是"__class__"或者其他你没想到的东西呢?你知道吗

如果你只有一些可能性,最好是明确的

if user_input == "size":
    val = the_ball.size
elif user_input in ("colour", "color"):
    val = the_ball.color
else:
    #error

相关问题 更多 >

    热门问题