2016-04-14 114 views
1

我想創建一個打印文件中某些值的平均值的程序。當我運行使用文件「cropdata.txt」我的代碼,其中包含此:你如何使用sum()和列表項?

Lettuce 1 2 3 
Tomato 6 5 1 

我得到以下錯誤:

line_mean = (sum(line_parts[1:])/len(line_parts)) 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

我真的不知道這是爲什麼,因爲我認爲我已將所選元素轉換爲整數。

我的代碼:

file = ('cropdata.txt') 
with open(file, 'r') as file_numsort_1: 
    for line in file_numsort_1: 
     line = (line.rstrip(" \n")) 
     line_parts = line.split(' ') 
     for num in line_parts[1:]: 
      num=int(num) 
     line_mean = (sum(line_parts[1:])/len(line_parts)) 
     print(line_mean) 
+1

'總和(地圖(INT ,line_parts [1:]))',你想要用len(line_parts) - 1'除。 'num = int(num)'只重新綁定'num',而不是列表中的值。 –

回答

1

您的代碼

for num in line_parts[1:]: 
    num=int(num) 

是不是真的做任何事情,作爲變量num被覆蓋在循環的每次迭代。因此,沒有任何數據從str轉換爲int類型,這是導致錯誤的原因。你要做的是創建數字的列表爲這樣:

file = ('cropdata.txt') 
with open(file, 'r') as file_numsort_1: 
    for line in file_numsort_1: 
     line = (line.rstrip(" \n")) 
     line_parts = line.split(' ') 

     num_list = [] 
     for num in line_parts[1:]: 
      num_list.append(int(num)) 

     line_mean = sum(num_list)/float(len(num_list)) 

其他一些注意事項:

  • 使用line.split(' ')是有點多餘的,因爲line.split()將自動分割空格分隔符。它還可以計算連續的空格作爲一個分隔符
  • 需要在line = line.rstrip()無參數,你肯定不需要封閉括號
  • 我添加了一個float()功能,您line_mean計算。在Python 2中,對兩個整數的操作保持爲整數(因此5/3 = 1,而不是1.66)。 我相信Python 3裏也有類似的行爲,但如果沒有(感謝澄清Bharel),是不是在Python 3
+0

Python 3沒有類似的行爲。 – Bharel

1

需要在轉換這樣num=int(num)這個浮動功能這一額外的功能不受到傷害,你沒將轉換保存回列表中。
嘗試轉換,像這樣:

line_parts = [int(x) for x in line_parts[1:]] 

再總結,像這樣:

line_mean = (sum(line_parts)/len(line_parts)) 

或者您也可以使用,而不是總結自己的statistics模塊。


優化版本:

import statistics 

file = ('cropdata.txt') 
with open(file, 'r') as file_numsort_1: 
    for line in file_numsort_1: 
     # Strip, split, and convert to int 
     line_ints = map(int, line.rstrip().split()[1:]) 

     # Print the mean 
     print(statistics.mean(line_ints)) 
+1

這會完全放棄'line_parts [0]'。 –

0

你的問題不在於sum但 '數字' 的名單,這應該解決您的問題:

line_parts = line.split(' ') 
list_of_nums = [int(item) for item in line_parts[1:]] 
line_mean = (sum(list_of_nums)/len(C)) 
print(line_mean)