簡體   English   中英

(For 循環):如何將平均值放在相應 avg 值的每個數字旁邊並打印具有最高平均值的數字?

[英](For loops): How to put average values beside each number of the corresponding avg value and print the number(s) with the highest average?

我的代碼:

name = ["AAAAA 4 2 1 2 4 2 4 4 5 2 2 1 5 2 4 3 1 1 3 3 5",
  "BBB 5 2 1 2 4 5 4 4 1 2 2 2 4 4 4 3 1 2 3 3 2",
  "K 4 1 2 1 2 1 2 5 1 1 1 1 4 2 2 1 5 1 3 4 1"]

count = 0
for line in name:
    for char in line:
        if char.isdigit():
            count += 1
final_count = int(count/len(name)) # 21

# count --->63
# print(len(name))--> 3 which gives the below number,
# print(final_count)--> 21


name = [name[i].split(" ") for i in range(len(name))]
for i in range(1, len(name[0])):
    bb = (int(name[0][i])+int(name[1][i])+int(name[2][i]))/len(name)


for i in range(1, final_count+1):
    print(i,bb)

輸出:錯!

1 2.6666666666666665
2 2.6666666666666665
3 2.6666666666666665
4 2.6666666666666665
5 2.6666666666666665
6 2.6666666666666665
7 2.6666666666666665
8 2.6666666666666665
9 2.6666666666666665
10 2.6666666666666665
11 2.6666666666666665
12 2.6666666666666665
13 2.6666666666666665
14 2.6666666666666665
15 2.6666666666666665
16 2.6666666666666665
17 2.6666666666666665
18 2.6666666666666665
19 2.6666666666666665
20 2.6666666666666665
21 2.6666666666666665

我的問題:如何將下面顯示的正確輸出放置在每個數字(最多 21)旁邊? 並打印最大平均值,例如,1 和 2 的平均值最高,我如何打印 1 和 2?

右側的正確值:

# After changing the line bb = (int(name[0][i])+int(name[1][i])+int(name[2][i]))/len(name) 
to 
print((int(name[0][i])+int(name[1][i])+int(name[2][i]))/len(name))

4.333333333333333
1.6666666666666667
1.3333333333333333
1.6666666666666667
3.3333333333333335
2.6666666666666665
3.3333333333333335
4.333333333333333
2.3333333333333335
1.6666666666666667
1.6666666666666667
1.3333333333333333
4.333333333333333
2.6666666666666665
3.3333333333333335
2.3333333333333335
2.3333333333333335
1.3333333333333333
3.0
3.3333333333333335
2.6666666666666665

注意:另外如何將數字四舍五入到兩位小數? 我嘗試做 round(_____, 2) 但它不起作用

您可以使用statistics.mean來查找數字的平均值。 並且由於您知道每行具有相同數量的整數,因此使用zip同時迭代行中的每個數字:

from statistics import mean

name = ["AAAAA 4 2 1 2 4 2 4 4 5 2 2 1 5 2 4 3 1 1 3 3 5",
  "BBB 5 2 1 2 4 5 4 4 1 2 2 2 4 4 4 3 1 2 3 3 2",
  "K 4 1 2 1 2 1 2 5 1 1 1 1 4 2 2 1 5 1 3 4 1"]

averages = []
for i, nums in enumerate(zip(*map(str.split, name))):
    if nums[0].isdigit():
        avg = mean(map(int, nums))
        print(f'{i} {avg:0.2f}')
        averages.append(avg)

highest = ' '.join(str(i) for i, a in enumerate(averages, 1) if a == max(averages))
print(f"the highest average(s) is: #{highest} at {max(averages):0.2f}")

這輸出:

1 4.33
2 1.67
3 1.33
4 1.67
5 3.33
6 2.67
7 3.33
8 4.33
9 2.33
10 1.67
11 1.67
12 1.33
13 4.33
14 2.67
15 3.33
16 2.33
17 2.33
18 1.33
19 3.00
20 3.33
21 2.67
the highest average is: #1 8 13 at 4.33

如果您可以使用熊貓,則可以通過以下方式完成:

import pandas as pd

name=["AAAAA 4 2 1 2 4 2 4 4 5 2 2 1 5 2 4 3 1 1 3 3 5",
      "BBB 5 2 1 2 4 5 4 4 1 2 2 2 4 4 4 3 1 2 3 3 2",
      "K 4 1 2 1 2 1 2 5 1 1 1 1 4 2 2 1 5 1 3 4 1"]


df = pd.DataFrame()
for item in name:
   n = item.split(' ')
   thelist = list(map(int, ','.join(n[1:]).split(',')))   
   df[n[0]] = thelist
df.index+=1

輸出:

df.mean(axis=1).round(2) 

Out[142]: 
1     4.33
2     1.67
3     1.33
4     1.67
5     3.33
6     2.67
7     3.33
8     4.33
9     2.33
10    1.67
11    1.67
12    1.33
13    4.33
14    2.67
15    3.33
16    2.33
17    2.33
18    1.33
19    3.00
20    3.33
21    2.67
dtype: float64

最高平均值:

max(df.mean(axis=1).round(2))
# 4.33

整個DF:

df['Average Values'] = df.mean(axis=1).round(2) 

輸出:

# df
Out[145]: 
    AAAAA  BBB  K  Average Values
1       4    5  4            4.33
2       2    2  1            1.67
3       1    1  2            1.33
4       2    2  1            1.67
5       4    4  2            3.33
6       2    5  1            2.67
7       4    4  2            3.33
8       4    4  5            4.33
9       5    1  1            2.33
10      2    2  1            1.67
11      2    2  1            1.67
12      1    2  1            1.33
13      5    4  4            4.33
14      2    4  2            2.67
15      4    4  2            3.33
16      3    3  1            2.33
17      1    1  5            2.33
18      1    2  1            1.33
19      3    3  3            3.00
20      3    3  4            3.33
21      5    2  1            2.67

此代碼將提供預期的答案。

import math
name = [
     "BBB 5 2 1 2 4 5 4 4 1 2 2 2 4 4 4 3 1 2 3 3 2",
    "AAAAA 4 2 1 2 4 2 4 4 5 2 2 1 5 2 4 3 1 1 3 3 5",
  "K 4 1 2 1 2 1 2 5 1 1 1 1 4 2 2 1 5 1 3 4"]

count = 0
max = 0
max_index = 0
for index, line in enumerate(name):
    local_count = 0
    for char in line:
        if char.isdigit():
            count += 1
            local_count += 1
    if max < local_count:
        max = local_count
        max_index = index
final_count = int(count/len(name)) # 21

# count --->63
# print(len(name))--> 3 which gives the below number,
# print(final_count)--> 21


name = [name[i].split(" ") for i in range(len(name))]
index_range = [i for i in range(name.__len__()) if i is not max_index]
max_avg = 0
max_avg_index = []
for i in range(1, len(name[max_index])):
    bb = int(name[max_index][i])
    local_count = 1
    for j in index_range:
        if name[j].__len__()>i:
            bb = bb + int(name[j][i])
            local_count += 1
    bb = bb / local_count
    if (max_avg < bb):
        max_avg = bb
        max_avg_index = [i]
    elif max_avg == bb:
        max_avg_index.append(i)

print(max_avg_index, '%.2f' % max_avg)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM