我的代码可以计算所提供的文件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
>>>
答案 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)
您可以读入文件并将其存储为列表列表,然后只对行和列求和。可以使用sum和itertools完成此求和。
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()