确定n个元素列表的最小值

2024-06-24 12:24:42 发布

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

我在开发一个算法来确定n个元素的最小值时遇到了一些困难。不是求长度为n的数组的最小值,这很简单:

min = A[0]
for i in range(1, len(A)):
    if min > A[i]: min = A[i]
print min

但我的列表包含对象:

^{pr2}$

对于相同的“分类类型”对象,我有m个元素,我想通过比较第一个和最后一个的差异来找到相同“分类类型”的最小元素。在

示例:

obj1 = Object(['A', 'x', 4, 17])
obj2 = Object(['A', 'y', 5, 20])
obj3 = Object(['B', 'z', 10, 27])
obj4 = Object(['B', 'z', 2, 15])
obj5 = Object(['B', 'z', 20, 40])
obj6 = Object(['A', 'x', 6, 10])
obj7 = Object(['A', 'x', 2, 9])
list = [obj1, obj2, obj3, obj4, obj5, obj6, obj7]

所以我需要一个算法来确定列表的最小值:

一个| x-->对象(['A','x',6,10])

B | z-->;对象(['B','z',2,15])

一个| y-->对象(['A','y',5,20])

谢谢!在


Tags: 对象算法元素类型列表object分类min
3条回答

下面是一个简单易懂的动态过程方法:

class Object:
    def __init__(self, somelist):
        self.classification = somelist[0] # String
        self.type           = somelist[1] # String
        self.first          = somelist[2] # Integer
        self.last           = somelist[3] # Integer
    def weight(self):
        return self.last - self.first
    def __str__(self):
        return "Object(%r, %r, %r, %r)" % (self.classification, self.type, self.first, self.last)
    __repr__ = __str__

obj1 = Object(['A', 'x', 4, 17])
obj2 = Object(['A', 'y', 5, 20])
obj3 = Object(['B', 'z', 10, 27])
obj4 = Object(['B', 'z', 2, 15])
obj5 = Object(['B', 'z', 20, 40])
obj6 = Object(['A', 'x', 6, 10])
obj7 = Object(['A', 'x', 2, 9])
olist = [obj1, obj2, obj3, obj4, obj5, obj6, obj7]

mindict = {}
for o in olist:
    key = (o.classification, o.type)
    if key in mindict:
        if o.weight() >= mindict[key].weight():
            continue
    mindict[key] = o
from pprint import pprint
pprint(mindict)

输出如下:

^{pr2}$

注意:__str____repr__和{}只是为了得到精美的打印输出,这不是必需的。同样,上面的代码在python2.2到2.7上运行不变。在

运行时间:O(N),其中N是列表中的对象数。对对象进行排序的解决方案平均为O(N*log(N))。另一个解决方案是O(K*N),其中K<;=N是从对象派生的唯一(分类、类型)键的数量。在

使用的额外内存:仅O(K)。其他的解决方案似乎是O(N)。在

import itertools 
group_func = lambda o: (o.classification, o.type)
map(lambda pair: (pair[0], min(pair[1], key=lambda o: o.last - o.first)),
    itertools.groupby(sorted(l, key=group_func), group_func))

group_func返回一个包含对象分类的元组键,然后是type(例如('A', 'x'))。这首先用于对列表lsorted调用)进行排序。然后,我们在排序后的列表上调用groupby,使用group_func分组到子列表中。每次密钥更改,我们都有一个新的子列表。与SQL不同,groupby要求在同一个键上对列表进行预排序。map接受groupby函数的输出。对于每个组,map返回一个元组。第一个元素是pair[0],它是键('A', 'x')。第二个是组(pair[1])的最小值,由last - first键确定。在

filtered = [obj for obj in lst if obj.classification == 'A' and obj.type = 'x']
min(filtered, key=lambda x: x.last - x.first)

注意:不要将变量命名为list:它隐藏了内置变量。在

相关问题 更多 >