在python中混淆输出

时间:2013-04-30 13:21:34

标签: python

我想找到一组数据中的最高温度,并将输出打印为“最热的温度是x in y”,其中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。”印刷呢?我在哪里弄错了?

5 个答案:

答案 0 :(得分:1)

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

解决这个问题的最快方法是做两个循环:一个用于构建列表,另一个用于查找最热门的循环。

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

答案 1 :(得分: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'为真。)

答案 2 :(得分: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])

尝试上面这个应该按预期工作......

答案 3 :(得分:0)

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

  1. 您正在为每个数据列表元素创建热门列表,并在热门列表中查找最大值。在第一个循环中它是41.2并且它实际上在第一行内。所以,它正常打印。
  2. 直到循环用于数据的第三个列表元素,没有最大值超过41.2并且没有打印。
  3. 当循环用于数据中的第三个列表元素时,最大值为44.2并且打印出来并且此后没有最大值,并且不会打印。

答案 4 :(得分: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)