2017-04-21 4 views
0

Ich versuche, eine CSV-Datei als Liste in diesem Python-Programm zu lesen. Die Datei test.csv enthält nur eine Zeile mit verschiedenen Nummern. Ich möchte die mögliche Kombination von Zahlen finden, deren Summe gleich 500 ist, und nachdem das Python-Programm als Liste ausgegeben wurde, fügt es diese Liste in meine test.csv-Datei ein.nicht unterstützte Operandentyp (en) für +: 'int' und '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) 

ich alle Code geschrieben, aber immer diese Fehlermeldung:

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

Diese Funktion funktioniert einwandfrei bei einer gültigen Eingabe, sodass Sie diese Eingabe nicht richtig erhalten. – TemporalWolf

Antwort

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

Ihre Eingabe/wie Sie es importieren ist Ihr Problem:

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

funktioniert, während:

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

nicht.

reader muss eine verschachtelte Liste sein, die dann sum([[]])TypeError: unsupported operand type(s) for +: 'int' and 'list'

gibt, nachdem Sie Ihre Eingabe beheben, werden Sie wahrscheinlich

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

erhalten, das bedeutet, dass Sie diese Liste Ints abbilden müssen. Um dies zu beheben, den list() Anruf mit map(int,) würde ersetzt:

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)' erhöht die Verschachtelung nicht, es kopiert nur den Inhalt der Liste in einen neuen Container. Ich denke, das Problem ist, dass "Leser" ist * bereits * eine verschachtelte Sequenz, noch vor "Liste (Leser)". – jez

+0

was wiederum bedeuten würde, dass man es nicht direkt "abbilden" kann. – jez

+0

@jez Ich habe * erwähnt, nachdem Sie Ihre Eingabe korrigiert haben *. Ohne zu wissen, wie die CSV-Datei aussieht, können wir nur raten, wie sie am besten zu beheben ist. – TemporalWolf

0

list(reader) gibt Ihnen eine Liste von Zeilen, wobei jede Zeile eine Liste von Strings. Mit anderen Worten, Ihre row1 ist eine Liste von Listen, keine Liste von Zahlen, weshalb sum() diese besondere Ausnahme wirft.

Die Tatsache, dass Sie es benannt haben row1 schlägt vor, dass Sie nur in der ersten Zeile interessiert sind. Wenn ja, dann wollen Sie eigentlich sagen row1 = list(reader)[0] und das würde Ihnen eine Liste geben, die sum() arbeiten kann. Aber pass auf, dass du den Zugriff auf den Rest der Tabelle verlierst, wenn du das tust.

Ein zweites Problem ist, dass Sie die einzelnen Einträge von Zeichenfolgen in Zahlen konvertieren müssen, sonst erhalten Sie nicht das Ergebnis, das Sie voraussichtlich von sum() erwarten.

die gesamte Tabelle zu erhalten, während es von Strings in Zahlen umzuwandeln, könnten Sie dies tun:

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] 

und dann wie bisher.

+0

Ich habe Ihren Code verwendet, aber es gibt mir Fehler 'Konnte Zeichenfolge in Float nicht konvertieren:'. Meine CSV-Datei enthält verschiedene Zahlen, die durch Komma getrennt sind, wie '100,200,300,400,200,40,30,440,840,899,344,440,100,100' –

+0

Verwenden Sie die List-Verständnis-Version von der Befehlszeile, und wenn Sie diesen Fehler können Sie fragen, was' x' ist. Es wird etwas sein, das nicht in 'float' umgewandelt werden kann. Programm um das herum. Sie müssen möglicherweise Ihre eigene 'def convert (x)' -Funktion schreiben, um die Ausnahmefälle elegant zu behandeln, und verwenden Sie das anstelle von 'float()'. – jez

Verwandte Themen