取2d列表,编写最大列和平均列的程序

时间:2013-09-30 03:22:34

标签: python

我有一个新任务我刚刚完成,但它看起来非常可怕,知道这是一个更简单有效的方式来获得正确的输出,但我似乎无法弄明白。 这是作业的目标。 编写一个程序,将以下值存储在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

打印上半部分,但我编写的代码用来计算最大值和平均值是不好的。对于max我基本上用if,elif,语句将列中的所有索引相互映射,并且对于平均值我将每列的indency一起添加并平均,然后打印。无论如何都要用某种循环来计算底部的东西。可能类似于以下

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?

或类似的东西,我不是手动将每个索引号添加到每个列和行。最大的一个我不知道如何在循环中做。也可以使用NO LIST METHODS。只有append和len()可以使用。有什么帮助吗?

2 个答案:

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

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