1

我的代码可以计算提供的文件 alpha.txt 中每一行的最小/最大/总和,但它不能按列计算最小/最大/总和....有关如何做到这一点的任何想法都会有所帮助,谢谢!

def load_data():

    usrnput = input("Enter a filename ")
    my_list = [[float(i) for i in line.split(',')] for line in open(usrnput, "+r")]


    row = len(my_list)
    column = len(my_list[0])

    if row != column:
        print("invalid")
    else:
        pass

    count = 0
    for row in(my_list):
        count = count + 1
        print(count, row)



    secondc = input("Enter a number ")
    if secondc == '2':
      minimum(my_list)
    elif secondc =='3':
        maximum(my_list)
    elif secondc =='4':
        sum1(my_list)

def minimum(my_list):
    pickaposition = input("Enter a row or column: ")
    if pickaposition == ('1'):
        print(min(my_list[0]))
    elif pickaposition == ('2'):
        print(min(my_list[1]))
    elif pickaposition == ('3'): 
        print(min(my_list[2]))
    elif pickaposition == ('4'):
        print(min(my_list[3]))
    elif pickaposition == ('5'):
        print(min(my_list[4]))


def maximum(my_list):
    pickaposition = input("Enter a row or column: ")
    if pickaposition == ('1'):
        print(max(my_list[0]))
    elif pickaposition == ('2'):
        print(max(my_list[1]))
    elif pickaposition == ('3'): 
        print(max(my_list[2]))
    elif pickaposition == ('4'):
        print(max(my_list[3]))
    elif pickaposition == ('5'):
        print(max(my_list[4]))

def sum1(my_list):
    pickaposition = input("Enter a row or column: ")
    if pickaposition == ('1'):
        print(sum(my_list[0]))
    elif pickaposition == ('2'):
        print(sum(my_list[1]))
    elif pickaposition == ('3'): 
        print(sum(my_list[2]))
    elif pickaposition == ('4'):
        print(sum(my_list[3]))
    elif pickaposition == ('5'):
        print(sum(my_list[4]))

def main():
    print("""1 - Open and load from a file
2 - Minimum
3 - Maximum 
4 - Sum 
5 - Delete
6 - Save
7 - Save as (specify new file name)
0 - Exit
""")
    pick = input("Enter a number ")

    if pick == "1":
        load_data()
    else:
        pass





main()

alpha.txt 也包含数据

5,4,2,3.2
1,.2,4.4,8
3,8,6.5,2
3,2,1,5.3

我真的需要根据列分配变量 AZ,但我也不知道该怎么做。

这是我的代码的完整示例运行,可能会让您更轻松。

1 - Open and load from a file
2 - Minimum
3 - Maximum 
4 - Sum 
5 - Delete
6 - Save
7 - Save as (specify new file name)
0 - Exit

Enter a number 1
Enter a filename alpha.txt
1 [5.0, 4.0, 2.0, 3.2]
2 [1.0, 0.2, 4.4, 8.0]
3 [3.0, 8.0, 6.5, 2.0]
4 [3.0, 2.0, 1.0, 5.3]
Enter a number 3
Enter a row or column: 3
8.0
>>> 
4

4 回答 4

2

您的问题归结为:给定一个表示网格/矩阵的列表列表,您很容易提取一行,但如何提取一列?

下面是你如何做一行:

>>> a = [[5, 4, 3, 3.2], [1, .2, 4.4, 8], [3, 8, 6.5, 2], [3, 2, 1, 5.3]]
>>> a[0]
[5, 4, 3, 3.2]

这是做专栏的一种费力的方法。请注意,第一个索引会更改,但第二个索引不会。即,如果我们选择每一行的元素 2,我们会得到一列!

>>> column_two = [a[0][2], a[1][2], a[2][2], a[3][2]]
>>> column_two
[3, 4.4, 6.5, 1]

您可以通过列表理解使这更容易。

>>> [x[2] for x in a]
[3, 4.4, 6.5, 1]
>>> 

这相当于做:

column_two = []
for row in a:
    column_two.append(row[2])

在此之后,您可以重新使用现有函数并将它们传递给您提取的列而不是行。

于 2013-10-30T17:14:30.557 回答
2

您可以读取文件并将其存储为列表列表,然后对行和列求和。这种求和可以使用sumitertools来完成。

import itertools

with open('alpha.txt','rb') as f:
    values = [[float(word) for word in line.strip().split(',')] for line in f]

In [12]: values
Out[12]: 
[[5.0, 4.0, 2.0, 3.2],
 [1.0, 0.2, 4.4, 8.0],
 [3.0, 8.0, 6.5, 2.0],
 [3.0, 2.0, 1.0, 5.3]]

col_sum = [sum(i) for i in itertools.izip(*values) ]
row_sum = [sum(i) for i in values]
于 2013-10-30T17:16:13.823 回答
1

您应该能够通过执行以下操作对列求和:

def sumcolumn(my_list):
total = 0.0
pickaposition = input("Enter a column: ")
if pickaposition == ('1'):
    for x in row:
        total += my_list[x][0]
    print total
elif pickaposition == ('2'):
    for x in row:
        total += my_list[x][1]
    print total
elif pickaposition == ('3'): 
    for x in row:
        total += my_list[x][2]
    print total
elif pickaposition == ('4'):
    for x in row:
        total += my_list[x][3]
    print total
elif pickaposition == ('5'):
    for x in row:
        total += my_list[x][4]
    print total

显然这不是很干净或pythonic,但希望它足够简单,可以给你这个想法,你可以根据你的规范调整它。我建议 if 阻止检查它是否是 1-5 之间的数字,然后使用 total += my_list[x][pickaposition-1] 这样您就可以节省很多行。

如果您在最小/最大方面需要任何帮助,我也可以为这些示例提供示例,但希望您能够从中弄清楚如何做到这一点。

于 2013-10-30T17:13:16.413 回答
1

如果表中的所有元素都是相同的数字类型,请考虑使用numpy数组,它可以让您非常快速地进行数值计算。

例子:

import numpy

dataList = [[5, 4, 3, 3.2], [1, .2, 4.4, 8], [3, 8, 6.5, 2], [3, 2, 1, 5.3]] # this is a list of lists

dataArray = numpy.asarray(dataList)

现在让我们看看我们的数组:

dataArray
dataArray.dtype

这将产生输出:

array([[ 5. ,  4. ,  3. ,  3.2],
       [ 1. ,  0.2,  4.4,  8. ],
       [ 3. ,  8. ,  6.5,  2. ],
       [ 3. ,  2. ,  1. ,  5.3]])
dtype('float64')

python 决定定义每个元素的类型float64以适应 3.2、0.2、6.5 等元素。

您可以决定元素的 dtype 并分配它。(阅读参考部分中有关 ndarray 的页面)。

请记住,这axis=0是垂直方向,axis=1是 numpy 二维数组中的水平方向;您实际上可以拥有 n 维数组并相应地指定轴。

现在以快速有效的方式计算您需要的内容:

  • columnSums = dataArray.sum(axis=0)
    columnSums
    

    产生:

    array([ 12. ,  14.2,  14.9,  18.5])
    

    rowSums = dataArray.sum(axis=1)
    rowSums
    

    产生:

    array([ 15.2,  13.6,  19.5,  11.3])
    

    overallSum = dataArray.sum()
    overallSum
    

    这是:

    59.599999999999994
    

相似地:

  • 分钟

    columnMins = dataArray.min(axis=0)
    rowMins = dataArray.min(axis=1)
    overallMin = dataArray.min()
    
  • 最大限度

    columnMaximums = dataArray.max(axis=0)
    rowMaximums = dataArray.max(axis=1)
    overallMax = dataArray.max(dataArray)
    

您甚至可以执行以下操作:

thirdColSum = dataArray[:,2].sum()
lastRowSum = dataArray[-1].sum()
firstColAndTopTowRowsMin = dataArray[0:2,0].min()
bottomThreeRowsAndLastTwoCol = dataArray[-3:,-2:]
bottomThreeRowsAndLastTwoColMax = dataArray[-3:,-2:].max()

参考:

  1. http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
  2. http://docs.scipy.org/doc/numpy/user/basics.indexing.html
  3. http://docs.scipy.org/doc/numpy/reference/routines.html
  4. http://docs.scipy.org/doc/numpy/reference/routines.math.html
于 2013-10-30T20:38:29.850 回答