0

I want to find the maximum temperature in a set of data and print the output as "The hottest temperature was x in y" where x and y is temperature and city respectively. I have a code like this:

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 outputs that were produced:

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

Now I am confused with the outputs. I want to print only one line of output which is supposed to be "The hottest temperature was 44.2 in Manchester." since 44.2 is the maximum temperature in the data. Why did "The hottest temperature was 41.2 in Sheffield." is printed too? Where did I get it wrong?

4

5 に答える 5

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 に答える
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'たとえば、 は true です)。

于 2013-04-30T13:28:26.570 に答える
1

繰り返しながらリストを作成しており、これまでmaxのようにリストを操作しています。シェフィールドに着くと、これまでに見た中で最も暑いので、印刷されます。しかし、まだ見たことがないので、マンチェスターがさらに暑いことを知ることはできません。

これを修正する最も簡単な方法は、2 つのループを実行することです。

(そして、マンチェスターで 44.2? 夢の中で。)

于 2013-04-30T13:27:55.677 に答える
0

それを行うための2行の、非常に「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 に答える
0

まず第一に、これはあなたが望むことを行うための効率的な方法ではないと言いたいです. しかし、この結果が得られた理由を知りたい場合は、説明します。

  1. データのすべてのリスト要素に対してホット リストを作成し、ホット リストで最大値を見つけています。最初のループでは 41.2 で、実際には最初の行の内側にあります。ということで、普通に印刷。
  2. ループが data の 3 番目のリスト要素になるまで、41.2 よりも最大値はなく、出力はありません。
  3. ループが data の 3 番目のリスト要素の場合、最大値は 44.2 であり、それが出力され、今後はこれよりも最大値がなくなり、出力されなくなります。
于 2013-04-30T13:37:24.837 に答える