无法计算列python的最小值/最大值/总和

时间:2013-10-30 17:00:02

标签: python

我的代码可以计算所提供的文件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

我真的需要根据列分配变量A-Z,但我不知道我会怎么做。

这里是我的代码的完整示例运行,以便您可以更轻松。

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 个答案:

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

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

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

答案 2 :(得分: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,但希望它很简单,可以给你这个想法,你可以根据自己的规格进行调整。我建议,如果阻止检查它是否是1-5之间的数字,然后使用总+ = my_list [x] [pickaposition-1],这样你就可以节省很多行。

如果你需要任何最小/最大帮助,我也可以举例说明,但希望你能从中找到解决办法。

答案 3 :(得分: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,2.2,6.5等元素。

你可以决定元素的类型并分配它。 (阅读参考资料部分中关于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