【问题标题】:How to display the sum of every row and column in a table in python如何在python中显示表格中每一行和每一列的总和
【发布时间】:2019-05-14 17:57:08
【问题描述】:

我正在尝试编写一个 python 程序,它创建一个 10 x 10 表(数组)并自动用 100 个范围从 1 到 250 的随机整数填充该表。然后程序应该显示每一行和每一列的总和这张桌子。

我的程序当前输出一个包含 100 个随机整数的表,以及每行的总和。但是它无法产生每列的总和。

import random

dash = "-" * 62

print("Random Integer Table:")

print(dash)
print("{:<10s} {:>45s}".format("RANDOM INTEGERS", "ROW TOTAL"))
print(dash)

for rows in range(10):
    random_list = [random.randrange(1,251, 1) for rows in range(10)]
    stringList = [str(i) for i in random_list]
    row_total = sum(random_list)

    print("{:<3} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4}".format(stringList[0], stringList[1], stringList[2], stringList[3], stringList[4], stringList[5], stringList[6], stringList[7], stringList[8], stringList[9]), "{:17d}".format(row_total))

print(dash)
print("COLUMN TOTAL")
print(dash)

sum(random_list(zip([0])))

程序当前输出如下:

Random Integer Table:
--------------------------------------------------------------
RANDOM INTEGERS                                     ROW TOTAL
--------------------------------------------------------------
71    29   33   69    6  188  167  158  126               892
100  114  109   89  237  168   25  201   43              1173
91    51   62  220   63   10   85   79  104               796
54   189   69   36  218  130  204   76   93              1289
113   36  104   81   18  215   53  169  103               925
92    20  206   16  116   69  237  168  212              1253
116   86  115   62  189  234  158  240  207              1602
35   101  234   25   41  136   73  154  197              1102
97    81   13   86   26  140  220   42  180              1132
118  117  134  170  237  212   89  140  124              1529
--------------------------------------------------------------
COLUMN TOTAL
--------------------------------------------------------------

但是一个错误:

TypeError: 'list' object is not callable

出现在我的代码的第 30 行(最后一行)中,当尝试打印每列的总数时。有什么方法可以正确总结这些列和/或提高程序的效率?谢谢。

【问题讨论】:

  • 错误是不言自明的。您正在尝试调用一个列表,该列表在此处不可调用:random_list(zip([0]))。如果您尝试使用zip 转置技巧,则将其倒退。
  • 这是sum(random_list(zip([0]))) 行。 Python 认为random_list 是可调用的,因为您以参数的形式输入了zip[0]
  • 因为random_list是你矩阵的最后一行。
  • 好的,我了解sum(random_list(zip([0]))) 是如何产生错误的,谢谢。由于这种方法不正确,还有其他可能的方法来对列求和吗?

标签: python python-3.x


【解决方案1】:

一种解决方案是在遍历每一行的同时保存列的总和。 这是一种方法:

import random
dash = "-" * 62

print("Random Integer Table:")

print(dash)
print("{:<10s} {:>45s}".format("RANDOM INTEGERS", "ROW TOTAL"))
print(dash)
# Initialize a list that will have the sum of each column
sum_col = [0 for _ in range(10)]

for rows in range(10):
    random_list = [random.randrange(1, 251, 1) for rows in range(10)]

    # Save the current sum of each columns
    sum_col = [x + sum_part for x, sum_part in zip(random_list, sum_col)]

    stringList = [str(i) for i in random_list]
    row_total = sum(random_list)

    print("{:<3} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4}".format(stringList[0], stringList[1], stringList[2], stringList[
          3], stringList[4], stringList[5], stringList[6], stringList[7], stringList[8], stringList[9]), "{:17d}".format(row_total))

print(dash)
print("COLUMN TOTAL")
print(dash)

print("{:<3} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4}".format(sum_col[0], sum_col[1], sum_col[2], sum_col[
    3], sum_col[4], sum_col[5], sum_col[6], sum_col[7], sum_col[8], sum_col[9]), "{:17d}".format(sum(sum_col)))

# Random Integer Table:
# --------------------------------------------------------------
# RANDOM INTEGERS                                     ROW TOTAL
# --------------------------------------------------------------
# 147   54   61   56  183  172  228  110  241              1260
# 211   77   80  148  237   98   30   99    8              1016
# 216  241  200   31  218  122  183   34  118              1420
# 34   147  195  115   61   69  208  155   96              1203
# 174   27   39   40   99  241   11   92  114               838
# 102  131    8  130   22  225   80  152  159              1032
# 129   30  122   87  142  245  202   97   40              1280
# 219  226  147  153  217  242  154  129   39              1585
# 186   37  123  168   12  152  105  225   57              1072
# 120  243  146   39  216   50  177  208   36              1434
# --------------------------------------------------------------
# COLUMN TOTAL
# --------------------------------------------------------------
# 1538 1213 1121  967 1407 1616 1378 1301  908             12140

如果您可以使用numpy,请使用它!它更简单:) 希望有所帮助!

【讨论】:

    【解决方案2】:

    这里只是干净一点。我正在使用 numpy 而不是随机的。这样,您的随机表数组将根据需要保留。另请注意stringList 是如何传递给格式字符串以减少输入的。

    import numpy as np
    
    dash = "-" * 62
    
    print("Random Integer Table:")
    
    print(dash)
    print("{:<10s} {:>45s}".format("RANDOM INTEGERS", "ROW TOTAL"))
    print(dash)
    
    
    array_size = (10, 10)
    
    random_array = np.random.random_integers(1, 251, size=array_size)
    
    for i in range(array_size[0]):
        random_list = [j for j in random_array[i, :]]
        stringList = [str(j) for j in random_list]
        row_total = sum(random_list)
        print("{:<3} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4} {:>4}".format(*stringList), "{:17d}".format(row_total))
    
    
    print(dash)
    print("COLUMN TOTAL")
    print(dash)
    column_totals = random_array.sum(axis=0)
    print(" ".join(column_totals.astype(str)))
    
    Random Integer Table:
    --------------------------------------------------------------
    RANDOM INTEGERS                                     ROW TOTAL
    --------------------------------------------------------------
    25   227  148  226  104  244   84   89   38   58              1243
    86    52  110  176  147    9   80  214    7  249              1130
    135  106   27   70    2   69  166  115   46  230               966
    214  247   39   34  198   99  226   24  106   23              1210
    159    6   76   99   89  177   83   57  224  155              1125
    147  207   85  241  144  162  121  209    9   91              1416
    78   144   73  240  226  164  167  207   37  171              1507
    52     8  230   42  243   12  213  179  203   34              1216
    203  116   44    8  198  212   92  162  179  144              1358
    82    46  113  183  209   37   71  110  203    7              1061
    --------------------------------------------------------------
    COLUMN TOTAL
    --------------------------------------------------------------
    1181 1159 945 1319 1560 1185 1303 1366 1052 1162
    

    【讨论】:

    • 这也是另一种方式。感谢您的建议,我们总是很感激!
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多