Python 如何获取共享最小属性值的对象子列表?

Python 如何获取共享最小属性值的对象子列表?,python,Python,我有一个创建类中的对象列表。从这个列表中,我需要创建一个对象的子列表,这些对象共享相同的最小值,其中value是类的属性 目前,我正在使用以下算法: #查找具有最小值的对象的索引 值=[] 对于对象中的对象: values.append(object.value) values=np.array(值) _min_值=np的_对象的索引。其中(值==values.min())[0] #创建带有索引的子列表 对象\u与\u min\u值=[] 对于具有最小值的对象的索引中的索引: 具有最小值的对象。

我有一个创建类中的对象列表。从这个列表中,我需要创建一个对象的子列表,这些对象共享相同的最小值,其中
value
是类的属性

目前,我正在使用以下算法:

#查找具有最小值的对象的索引
值=[]
对于对象中的对象:
values.append(object.value)
values=np.array(值)
_min_值=np的_对象的索引。其中(值==values.min())[0]
#创建带有索引的子列表
对象\u与\u min\u值=[]
对于具有最小值的对象的索引中的索引:
具有最小值的对象。追加(对象[索引])
我认为一定有一种更具python风格的方法,而不是使用两个for循环并将我的
值列表
转换为
numpy.array()
我能做些什么,使这个算法更好,所以也许我不需要使用任何for循环。我认为有一种方法可以理解列表,但我不知道如何做到这一点

您可以在一行中完成

[obj.value==min(objects,key=lambda x:x.value).value时对象中obj的obj]
此行检索
等于所有值最小值的所有对象

更好的方法是先保存最小值,然后使用列表理解:

#获取最小值
minValue=min(对象,键=lambda x:x.value).value
#获取其值等于最小值的所有对象
[如果obj.value==minValue,则对象中的obj对应于obj]
这样,您就不会重新计算每个项目的最小值。

您可以在一行中进行计算

[obj.value==min(objects,key=lambda x:x.value).value时对象中obj的obj]
此行检索
等于所有值最小值的所有对象

更好的方法是先保存最小值,然后使用列表理解:

#获取最小值
minValue=min(对象,键=lambda x:x.value).value
#获取其值等于最小值的所有对象
[如果obj.value==minValue,则对象中的obj对应于obj]

这样,您就不会重新计算每个项目的最小值。

您可以使用
过滤器
枚举

class Foo:
  def __init__(self, value):
    self.value = value

f1, f2, f3 = map(Foo, (1,1,3))
minval = min(getattr(x, 'value') for x in (f1, f2, f3))
objs =list(filter(lambda x: x[1].value==minval, enumerate((f1, f2, f3))))

objs
将是包含两个元素的元组列表,第一个元素是索引,第二个元素是实例。

您可以使用
filter
enumerate

class Foo:
  def __init__(self, value):
    self.value = value

f1, f2, f3 = map(Foo, (1,1,3))
minval = min(getattr(x, 'value') for x in (f1, f2, f3))
objs =list(filter(lambda x: x[1].value==minval, enumerate((f1, f2, f3))))

objs
将是一个包含两个元素的元组列表,第一个元素是索引,第二个元素是实例。

因此您的类公开了一个
属性?@corentpane是的,我在构造函数中设置了这个值,并使用这个类的一些方法对其进行了修改。我不使用任何getter或setter,也不保护此属性。因为您的类公开了一个
属性?@corentpane是的,我在构造函数中设置了此值,并使用此类的一些方法对其进行了修改。我不使用任何getter或setter,也不保护这个属性。我认为你应该计算最小值,而不是硬编码以提供更清晰的答案。你是对的,我认为OP指定了它而不是计算它。补充更正我认为你应该计算最小值,而不是硬编码以提供更清晰的答案。你是对的,我认为OP指定了它而不是计算它。在您的第二行中添加了更正,我收到错误“无法分配到列表理解”。我正在使用python 3.7。4@CorentinPane,有一个打字错误。你的意思是如果obj.value==minValue
?我认为要只检索minValue,我必须执行
minValue=min(objects,key=lambda x:x.value)。value
在你的第二行中,我有一个错误“无法分配给列表理解”。我正在使用python 3.7。4@CorentinPane,有一个打字错误。你的意思是
如果obj.value==minValue
?我认为要只检索minValue,我必须执行
minValue=min(对象,key=lambda x:x.value)。value