2017-04-21 126 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

相关问题