不支持的操作数类型为+:'int'和'list'
我想读取一个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'
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)
'list(something_that_is_already_a_list)'不会增加嵌套,它只是将列表内容复制到一个新的容器中。我认为问题在于,'reader'已经是一个嵌套的序列,甚至在'list(reader)'之前。 – jez
这又意味着你不能'直接映射(int,...)'它。 – jez
@jez在修复输入后,我确实提到了*。不知道csv文件是什么样子,我们只能猜测如何最好地解决它。 – TemporalWolf
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]
,然后像以前一样进行。
我用你的代码,但它给了我错误'不能将字符串转换为float:'。我的csv文件包含以逗号分隔的各种数字,如'100,200,300,400,200,40,30,440,899,344,440,100,100' –
使用命令行中的列表理解版本,并且在发生此错误时,请问它是什么'x'。这将是不能转换为'浮动'的东西。围绕这个计划。你可能必须编写自己的'def convert(x)'函数来优雅地处理异常情况,并使用它来代替'float()'。 – jez
此功能对有效输入正常工作,所以你没有正确地得到输入。 – TemporalWolf