列表中的列表最大值?

时间:2014-08-26 08:50:55

标签: python

我在使用Python查找列表中列表的最大值时遇到问题。

问题:maximum_power(data)从csv文件中获取数据并返回列表 该阵列的特定日期的阵列名称和最大功率对,单位为kW。

时必须是“回答”
data = load_data(date)
maximum_power(data)

用于解释器中的特定日期。所以,在某种程度上我给出了答案,我需要提供一个代码,它可以为所有建筑物提供以下结果。

data = load_data(date)
maximum_power(data)
    [('Building 1', 859.45),
     ('Building 2', 129.0),
     ('Building 3', 079.85),
     ('Building 4', 409.05),

以下是仅使用load_data(date)时获得的数据示例。这是(time, temp, sunlight intensity, (power for all the buildings)形式的数据。

(('18:30', 14.8, 0.0, (0, 0, 19, 29)),
 ('18:31', 14.8, 0.0, (0, 0, 19, 29)),
 ...)

然而,就我而言,我只关心为权力部分(0, 0, 19, 29)中的每个建筑物创建最大功率列表的权力。但是,由于数据是一整天,我需要知道如何在(a, b, c, d)中找到每个元素的最大值,并在列表中插入字符串,即建筑物名称。

4 个答案:

答案 0 :(得分:0)

使用当天消耗最多的建筑物找到建筑物的方法之一。

maximum_power = [('Building 1', 859.45), ('Building 2', 129.0), ('Building 3', 079.85), ('Building 4', 409.05)]

maximum = 0
building = '' 

for k,v in maximum_power:
if v > maximum:
  maximum = v
  building = k

print building, maximum     

答案 1 :(得分:0)

如果我正确理解您的问题,解决方案是:

    def maximum_power(data):
        max = data[0]
        for datum in data :
            if datum[1] > max[1]:
                max = datum
        return max

执行给出:

    >>> data = [('Building 1', 859.45),('Building 2', 129.0),('Building 3', 079.85),('Building 4', 409.05)]
    >>> maximum_power(data)
    ('Building 1', 859.45)

另一种解决方案是创建一个对象类并定义该类的比较方法,然后使用内置的max函数。

    class Building(object):
        def __init__(self, name, power):
            self.name = name                                                        
            self.power = power                                                        

        def __repr__(self):
            return '<Building : {0}, {1}>'.format(self.name, self.power)                                                        

        def __gt__(self, other):
            """ Greter than method """
            return self.power.__gt__(other.power)

然后在执行时间:

    >>> from Building import Building
    >>> data = [Building('Building 1', 859.45),Building('Building 2', 129.0),Building('Building 3', 079.85),Building('Building 4', 409.05)]
    >>> max(data)
    <Building : Building 1, 859.45>

答案 2 :(得分:0)

如果power-value始终是子列表中的第二个条目,那么我建议在生成器表达式上使用max(),如下所示:

maximum_power = [('Building 1', 859.45), ('Building 2', 129.0), ('Building 3', 079.85), ('Building 4', 409.05)]
max((power[1] for power in maximum_power))

应该很快。

答案 3 :(得分:0)

要获得所有建筑物的最大功率,首先必须提取所有建筑物的功率值。您可以通过zip数据,获取最后一个元素,然后再次压缩来完成此操作。接下来,您必须获得每栋建筑的所有权力的最大值。使用mapmax应用于每个列表。最后,您可以使用enumerate将这些与通用Building X字符串组合在一起。

def maximum_power(data):
    powers = zip(*zip(*data)[-1])
    maxima = map(max, powers)
    return [("Building %d" % (i+1), m) for i, m in enumerate(maxima)]

或者,如果您有一个建筑物名称列表,例如buildings = ['Building 1', 'Building 2', 'Building 3', 'Building 4'],您可以使用另一个zip为建筑物分配权力:

    return zip(buildings, maxima)

由于您的要求:您也可以使用mapzip执行相同操作,而不是使用一些非常复杂的列表推导。不过,我建议您使用zipmap

def maximum_power(data):
    powers = [[d[-1][i] for d in data] for i in range(len(buildings))]
    maxima = [max(p) for p in powers]
    return [(buildings[i], maxima[i]) for i in range(len(buildings))] 

示例(所有这些变体都相同):

>>> buildings = ['Building 1', 'Building 2', 'Building 3', 'Building 4']
>>> data = (('18:30', 14.8, 0.0, (0, 0, 19, 29)),
...         ('18:31', 14.8, 0.0, (0, 2, 19, 29)),
...         ('18:32', 14.8, 0.0, (4, 0, 29, 29)),
...         ('18:33', 14.8, 0.0, (3, 0, 19, 39)),
...         ('18:34', 14.8, 0.0, (0, 0, 19, 29))
...        )
>>> maximum_power(data)
[('Building 1', 4), ('Building 2', 2), ('Building 3', 29), ('Building 4', 39)]