0

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

二维列表的打印在下面完成,我的问题是计算最大值和平均值。

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

这会打印上半部分,但我编写的用于计算最大值和平均值的代码很糟糕。对于最大值,我基本上将列中的所有索引与 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?

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

4

2 回答 2

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,

如果你被允许使用 enumerate 函数,这可以做得更好一点:

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
于 2013-09-30T03:34:53.857 回答
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)
于 2013-09-30T03:39:02.333 回答