2017-04-21 46 views
0

我想讀取一個csv文件列表在這個python程序。文件test.csv只包含一行不同的數字。我想找到總和等於500的數字的可能組合,並且在獲得輸出作爲列表之後,python程序將在我的test.csv文件中追加這個列表。不支持的操作數類型爲+:'int'和'list'

csv_file.py

import sys 
import csv 
import os 

file_name="test.csv" 
path1 = "C:\MAYANK\python p" 
path2 = os.path.join(path1, file_name) 

with open(path2, 'r') as csv_file: 
    reader = csv.reader(csv_file, delimiter=",") 
    row1 = list(reader) 


def subset_sum(numbers, target, partial=list()): 
    s = sum(partial) 
    # check if the partial sum is equals to target 
    if s == target: 
     with open(path2, 'a') as csv_file1: 
     writer = csv.writer(csv_file1) 
     writer.writerow(partial) 

    if s >= target: 
     return # if we reach the number why bother to continue 

    for i in range(len(numbers)): 
     n = numbers[i] 
     remaining = numbers[i + 1:] 
     subset_sum(remaining, target, partial + [n]) 

if __name__ == '__main__': 
    subset_sum(row1, 500) 

我寫的所有代碼,但得到這個錯誤:

Traceback (most recent call last): 
File "csv_file.py", line 33, in <module> 
subset_sum(row1, 500) 
File "csv_file.py", line 30, in subset_sum 
subset_sum(remaining, target, partial + [n]) 
File "csv_file.py", line 17, in subset_sum 
    s = sum(partial) 
TypeError: unsupported operand type(s) for +: 'int' and 'list' 
+1

此功能對有效輸入正常工作,所以你沒有正確地得到輸入。 – TemporalWolf

回答

2
with open(path2, 'r') as csv_file: 
    reader = csv.reader(csv_file, delimiter=",") 
    row1 = list(reader) 

你輸入/你是如何導入是你們的問題:

>>> subset_sum([111,222,333,444,555, 499, 1, 389, 20, 369], 500) 
[111, 389] 
[111, 20, 369] 
[499, 1] 

作品,而:

>>> subset_sum([111,222,333,444,555, [499], 1, 389, 20, 369], 500) 
TypeError: unsupported operand type(s) for +: 'int' and 'list' 

沒有。

reader必須是一個嵌套列表,然後sum([[]])TypeError: unsupported operand type(s) for +: 'int' and 'list'

您解決您的輸入後,你可能會得到

TypeError: unsupported operand type(s) for +: 'int' and 'str' 

,這意味着你需要映射該列表整數。爲了解決這個問題將與map(int,)被替換list()電話:

with open(path2, 'r') as csv_file: 
    reader = csv.reader(csv_file, delimiter=",") 
    row1 = map(int, reader) 
+2

'list(something_that_is_already_a_list)'不會增加嵌套,它只是將列表內容複製到一個新的容器中。我認爲問題在於,'reader'已經是一個嵌套的序列,甚至在'list(reader)'之前。 – jez

+0

這又意味着你不能'直接映射(int,...)'它。 – jez

+0

@jez在修復輸入後,我確實提到了*。不知道csv文件是什麼樣子,我們只能猜測如何最好地解決它。 – TemporalWolf

0

list(reader)給你行,每行是一個字符串列表清單。換句話說,您的row1列表列表,而不是數字列表,這就是爲什麼sum()引發該特定異常。

您已將其命名爲row1的事實表明您只對第一行感興趣。如果是這樣,那麼你實際上的意思是說row1 = list(reader)[0],那會給你一個sum()可以工作的列表。但要注意,如果你這樣做,你將失去對錶格其餘部分的訪問。

第二個問題是您需要將單個條目從字符串轉換爲數字,否則您無法獲得大概預計從sum()得到的結果。

爲了保持整個表,同時從字符串將其轉換爲數字,你可以這樣做:

with open(path2, 'r') as csv_file: 
    reader = csv.reader(csv_file, delimiter=",") 
    table = [[float(x) for x in row] for row in reader] 
    row1 = table[0] 

,然後像以前一樣進行。

+0

我用你的代碼,但它給了我錯誤'不能將字符串轉換爲float:'。我的csv文件包含以逗號分隔的各種數字,如'100,200,300,400,200,40,30,440,899,344,440,100,100' –

+0

使用命令行中的列表理解版本,並且在發生此錯誤時,請問它是什麼'x'。這將是不能轉換爲'浮動'的東西。圍繞這個計劃。你可能必須編寫自己的'def convert(x)'函數來優雅地處理異常情況,並使用它來代替'float()'。 – jez

相關問題