0

我想在一组数据中找到最高温度并将输出打印为“最热的温度是 y 中的 x”,其中 x 和 y 分别是温度和城市。我有这样的代码:

data = [['Sheffield', '41.2', '35.5', '41.1'],
       ['Lancaster', '31.3', '40.2', '37.9'],
       ['Southampton', '34.8', '33.9', '32',],
       ['Manchester', '41.9', '41.5', '44.2'],
       ['Bristol', '42.1', '37.1', '42.2']]

hot = []
for row in data:
    for item in row:
        if item == max(row[1:]):
           hot.append(item)

    if max(hot) in row:
       print "The hottest temperature was {0} in {1}.".format(max(hot),row[0])

产生的输出:

The hottest temperature was 41.2 in Sheffield.
The hottest temperature was 44.2 in Manchester.

现在我对输出感到困惑。我只想打印一行输出,应该是“曼彻斯特最热的温度是 44.2”。因为 44.2 是数据中的最高温度。为什么会出现“谢菲尔德最热的温度是 41.2”。也打印?我哪里弄错了?

4

5 回答 5

1

您在迭代时正在构建列表,并且目前正在max对列表进行操作。当你到达谢菲尔德时,这是迄今为止你见过的最热的,所以它会打印出来。但它无法知道曼彻斯特更热,因为它还没有看到它。

解决这个问题的最快方法是执行两个循环:一个是建立列表,另一个是找到最热的。

(而且,曼彻斯特的 44.2?在你的梦中。)

于 2013-04-30T13:27:55.677 回答
1

您检查每一行的最大值hot是否在row,而不是在处理完所有行后检查一次。

尝试这个:

hot = []
for row in data:
    for item in row:
        if item == max(row[1:]):
           hot.append(item)

    if max(hot) in row:
       max_row = row

print "The hottest temperature was {0} in {1}.".format(max(hot),max_row[0])   

顺便说一句,您将所有温度存储为字符串,而不是浮点数。如果温度分布范围更广,您可能会得到一个奇怪的结果('5' > '35.3'例如,这是真的)。

于 2013-04-30T13:28:26.570 回答
1
data = [['Sheffield', '41.2', '35.5', '41.1'],
   ['Lancaster', '31.3', '40.2', '37.9'],
   ['Southampton', '34.8', '33.9', '32',],
   ['Manchester', '41.9', '41.5', '44.2'],
   ['Bristol', '42.1', '37.1', '42.2']]

hot = []
for row in data:
    for item in row:
        if item == max(row[1:]):
            hot.append(item) 

for row in data:
    if max(hot) in row:
         print "The hottest temperature was {0} in {1}.".format(max(hot),row[0])

尝试上述方法,这应该可以按您的预期工作...

于 2013-04-30T13:38:03.830 回答
0

首先,我想说这不是做你想做的事的有效方法。但如果你想知道为什么会得到这个结果,我会为你解释;

  1. 您正在为数据的每个列表元素创建热门列表并在热门列表中查找最大值。在第一个循环中,它是 41.2,它确实在第一行之内。因此,它可以正常打印。
  2. 直到循环用于 data 的第三个列表元素,没有最大值超过 41.2 并且没有打印。
  3. 当循环用于数据中的第三个列表元素时,最大值为 44.2 并被打印,此后将没有最大值,也不会打印。
于 2013-04-30T13:37:24.837 回答
0

两行,非常“pythonic”的方式:

hot = sorted([(max(x[1:]), x[0]) for x in data], key=lambda x: x[0])[-1]
print "The hottest temperature was {0} in {1}.".format(*hot)
于 2013-04-30T20:12:39.797 回答