2013-04-30 122 views
0

我想找到一組數據中的最高溫度,並將輸出結果打印爲「最熱的溫度是x的y」,其中x和y分別是溫度和城市。我有這樣的代碼:與python輸出混淆

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」。也打印?我在哪裏弄錯了?

回答

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'爲真),則可能會得到奇怪的結果。

+0

謝謝您的解決方案。現在我知道我錯了。 – 2013-04-30 13:34:21

1

您在迭代時正在建立列表,並且max正在對列表進行操作目前爲止。當你到達謝菲爾德時,這是迄今爲止最熱門的,所以它打印。但它不知道曼徹斯特更熱,因爲它還沒有看到它。

解決這個問題的最快方法是做兩個循環:一個建立列表,然後第二個找到最熱門的。

(而且,44.2曼徹斯特?在你的夢想。)

0

首先,我想說這是不是有效的方式來做你想做的。但如果你想知道爲什麼你會得到這個結果,我會爲你解釋;

  1. 您正在爲每個數據列表元素創建熱列表,並在熱列表中查找最大值。在第一個循環中它是41.2,它確實在第一行中。所以,它通常打印它。
  2. 直到循環用於第三個列表元素的數據,沒有最大值超過41.2,並且沒有打印。
  3. 當循環用於數據中的第三個列表元素時,最大值爲44.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]) 

試試上面的一個,你預計這應該工作...

+0

堆棧溢出答案中的代碼應該被解釋,而不僅僅是被粘貼,以使提出問題的用戶理解你的答案。 – whatyouhide 2013-04-30 13:39:29

+0

這也適用。謝謝! – 2013-04-30 13:42:47

+0

@whatyouhide:感謝您的建議,我從現在開始發佈最近的答案,我嚴格按照您的建議。 – PBD 2013-04-30 13:45:48

0

兩行,頗有「Python的」做它的方式:

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)