我在使用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)
中找到每个元素的最大值,并在列表中插入字符串,即建筑物名称。
答案 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
数据,获取最后一个元素,然后再次压缩来完成此操作。接下来,您必须获得每栋建筑的所有权力的最大值。使用map
将max
应用于每个列表。最后,您可以使用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)
由于您的要求:您也可以使用map
和zip
执行相同操作,而不是使用一些非常复杂的列表推导。不过,我建议您使用zip
和map
。
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)]