2013-09-30 52 views
0

我有一個hw任務,我剛剛完成,但它看起來非常可怕,知道這是一個更簡單和有效的方式來獲得正確的輸出,但我不能像出來。繼承人是任務的目標。 寫存儲在2D列表中的下列值的程序(這些將被硬編碼):以2d列表和編寫程序爲列最大和平均

2.42 11.42 13.86 72.32 
56.59 88.52 4.33 87.70 
73.72 50.50 7.97 84.47 

程序應該確定每列的最大和平均

輸出看起來像

2.42 11.42 13.86 72.32 
56.59 88.52 4.33 87.70 
73.72 50.50 7.97 84.47 
============================ 
73.72 88.52 13.86 87.70 column max 
44.24 50.15 8.72 81.50 column average 

2d列表的打印在下面完成,我的問題是計算最大值和平均值。

data = [ [ 2.42, 11.42, 13.86, 72.32], 
     [ 56.59, 88.52, 4.33, 87.70], 
     [ 73.72, 50.50, 7.97, 84.47] ] 
emptylist = [] 
r = 0 
while r < 3: 
    c = 0 
    while c < 4 : 
     print "%5.2f" % data[r][c] , 
     c = c + 1 
    r = r + 1 
    print 
print "=" * 25 

這打印上半部分,但我寫的代碼來計算最大值和平均值是不好的。對於最大我基本comared所有索引在列與彼此與if,elif,語句和平均我每列添加逐漸趨勢並平均,然後打印。無論如何,用某種循環來計算底層的東西。也許像下面

for numbers in data: 
    r = 0  #row index 
    c = 0  #column index 
    emptylist= []   
    while c < 4 : 
     while r < 3 : 
      sum = data[r][c] 
      totalsum = totalsum + sum 
      avg = totalsum/float(rows) 
      emptylist.append(avg)  #not sure if this would work? here im just trying to 
      r = r + 1     #dump averages into an emptylist to print the values 
    c = c + 1       #in it later? 

或類似的東西在那裏我不是手動添加每個索引號的每一列和行。最大的一個我不知道如何做一個循環。也可以使用無列表方法。只能使用append和len()。任何幫助?

+0

你認爲什麼是「列表方式」? 'max'也包括在內? – justhalf

+0

在你的'for data in data'循環中,'numbers'將依次佔用'data'中的三行,但是你從不使用它。有效的是,由於'data'中有三行,因此您只需重複該循環中的代碼三次,每次都是一樣的。 – askewchan

+0

如圖所示,您的'c = c + 1'行不在'while c <4'循環內。因此,'c'將保持爲零,並且while循環將繼續無限地繼續。 – askewchan

回答

0

我會建議作出了兩個新的列表,每個每個行的大小相同,並保持運行總和於一體,並正在運行的最大的第二個:

maxes = [0] * 4 # equivalent to [0, 0, 0, 0] 
avgs = [0] * 4 
for row in data:  # this gives one row at a time 
    for c in range(4): # equivalent to for c in [0,1,2,3]: 
     #first, check if the max is big enough: 
     if row[c] > maxes[c]: 
      maxes[c] = row[c] 
     # next, add that value to the sum: 
     avgs[c] += row[c]/4. 

你可以打印出來,像這樣:

for m in maxes: 
    print "%5.2f" % m, 
for s in sums: 
    print "%5.2f" % s, 

如果你被允許使用的枚舉函數,這可以多一點很好地完成:

for i, val in enumerate(row): 
    print i, val 
0 2.42 
1 11.42 
2 13.86 
3 72.32 

所以它給我們的價值觀和索引,所以我們可以這樣使用它:

maxes = [0] * 4 
sums = [0] * 4 
for row in data: 
    for c, val in enumerate(row): 
     #first, check if the max is big enough: 
     if val > maxes[c]: 
      maxes[c] = val 
     # next, add that value to the sum: 
     sums[c] += val 
0

這裏是你在找什麼:

num_rows = len(data) 
num_cols = len(data[0]) 
max_values = [0]*num_cols # Assuming the numbers in the array are all positive 
avg_values = [0]*num_cols 
for row_data in data: 
    for col_idx, col_data in enumerate(row): 
     max_values[col_idx] = max(max_values[col_idx],col_data) # Max of two values 
     avg_values[col_idx] += col_data 
for i in range(num_cols): 
    avg_values[i] /= num_rows 

然後max_values將包含最大爲每列,而avg_values將包含每列的平均值。然後你就可以像往常一樣打印:

for num in max_values: 
    print num, 
print 
for num in avg_values: 
    print num 

或者乾脆(如果允許的話):

print ' '.join(max_values) 
print ' '.join(avg_values) 
相關問題