2015-11-09 92 views
2

我对从文本文件中排序数据有一半的问题。我想从3个加权数字中找出平均值,并打印出特定平均值所属文本文件中的哪个名称。Python,排序平均值

我设法做到了这一点的最高平均水平,但我有几个问题找到最低的平均水平。

来自文件的示例文本。

Shoes 210 130 67 
Bags 167 321 459 

文本文件中的位置0是部门的名称。文件中的位置1是“好评”。位置2'公平投票'。位置3'差投票'。

列表中最高盘是鞋,平均而言为2.351,排名中最低的是袋子,平均数为1.692。

我已经定义了一个函数来计算平均值,并调用它没有任何问题的最高平均水平。

highestAverage = 0 
    highestAvgDepName = 0  
    if choice2 == 1: 
     calculateAverage(allDepartments,choice2) 
     for x in range (10): 
      if highestAverage < calculateAverage(allDepartments, x): 
       highestAverage = calculateAverage(allDepartments, x) 
       highestAvgDepName = x 

我唯一的问题是得到这个找到最低的平均值。我已经尝试创建一个计算平均值的新函数,并将其乘以-1,将所有数字都转为负数,技术上这应该是最大的-1.692,但它会抛出55. ***。

我已经看着泡沫排序,但是,我不明白如何从文本文件做到这一点。

def calculateAverage(allDepartments, choice2): 
total = allDepartments[choice2][1] + allDepartments[choice2][2] + allDepartments[choice2][3] 
return((allDepartments[choice2][1]*3 + allDepartments[choice2][2]*2 + allDepartments[choice2][3])/total) 

回答

1

您可以使用此:

highestAverage = 0 
highestAvgDepName = 0  
if choice2 == 1: 
    calculateAverage(allDepartments,choice2) 
    for x in range (10): 
     if highestAverage > calculateAverage(allDepartments, x): 
      highestAverage = calculateAverage(allDepartments, x) 
      highestAvgDepName = x 
+0

我尝试了颠倒操作符,但它给了我一个错误的部门,平均值为0.000 –

+1

您可以发布calculateAverage的代码吗? –

+1

@ s.kelly你可以将它发布在你的问题的可读性? – SirParselot

0

你可以在你的部门存放在键入平均一本字典,然后储存您的平均值在列表和排序列表,以获得最高和最低平均像所以

def calculateAverage(choice2): 
    total = choice2[0] + choice2[1] + choice2[2] 
    return((choice2[0]*3 + choice2[1]*2 + choice2[2])/total) 

d={} 
l = [] 
with open(file,'r') as f: 
    for i in f: 
     tmp = i.split() 
     avg = calculateAverage([float(j) for j in tmp[1:]]) 
     d[avg] = tmp[0] 
     l.append(avg) 
    l = sorted(l) 
print 'Highest: {} {:.4}'.format(d[highest], highest) 
print 'Lowest: {} {:.4}'.format(d[lowest], lowest) 

Highest: Shoes 2.351 
Lowest: Bags 1.692 

,或者你能做到这样,它使用较少的内存

def calculateAverage(choice2): 
    total = choice2[0] + choice2[1] + choice2[2] 
    return((choice2[0]*3 + choice2[1]*2 + choice2[2])/total) 
d={} 
l = [] 
highest = -100000 
lowest = 100000 

with open(file,'r') as f: 
    for i in f: 
     tmp = i.split() 
     avg = calculateAverage([float(j) for j in tmp[1:]]) 
     d[avg] = tmp[0] 
     if avg > highest: 
      highest = avg 
     if avg < lowest: 
      lowest = avg 
print 'Highest: {} {:.4}'.format(d[highest], highest) 
print 'Lowest: {} {:.4}'.format(d[lowest], lowest) 
+0

谢谢!我还没有学过这样的词典,但它很有用。在打印报表时,是否有办法将最高和最低更改为3sf? (即2.351) –

+0

@ s.kelly是的,您可以使用格式来打印带有约束的字符串。这里是[链接](https://pyformat.info/),所以你可以阅读更多。打印复杂的字符串时非常有用。 – SirParselot