Liste in Excel Zelle schreiben.

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Bykl
User
Beiträge: 92
Registriert: Donnerstag 5. Oktober 2017, 17:57

Hallo, ich habe das Problem, daß mein Programm keine Liste in eine Excel Zelle schreiben will. Das andre funktioniert.

Was kann ich tun, um das Problem zu umgehen, bzw. zu lösen.

Code: Alles auswählen

from openpyxl import Workbook
from openpyxl import load_workbook
from sympy.ntheory import isprime
from sympy import primepi


wb = Workbook()
zahl=500
laufv=0
i=0

def ermittel_primteiler(x):
    primteiler_liste=[]
    for i in range(3,x//2,2):
        if x%i==0 and isprime(i):
            primteiler_liste.append(i)
    return(primteiler_liste)

ws=wb.active           
for n in range(3,zahl//2,10):
    i = i+1
    pendant=zahl-n-4
    laufv=zahl-pendant-4
    liste_laufv=ermittel_primteiler(laufv)
    liste_pendant=ermittel_primteiler(pendant)
    ws.append([i,pendant," PT",laufv,"PT"])
wb.save("test1excel.xlsx")
Dies muß falsch sein:

Code: Alles auswählen

 ws.append([i,pendant,ermittel_primteiler(pendant),laufv,"PT"])
denn er reagiert: ValueError: Cannot convert [17, 29] to Excel
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bykl: Was würdest Du denn an der Stelle erwarten? Man kann halt nur *einen* Wert in *einer* Zelle unterbringen. Geht doch direkt im Tabellenkalkulationsprogramm auch nicht anders.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Bykl
User
Beiträge: 92
Registriert: Donnerstag 5. Oktober 2017, 17:57

Ich habe das Problem inzwischen mit Typumwandlung gelöst:

Code: Alles auswählen

from openpyxl import Workbook
from openpyxl import load_workbook
import matplotlib.pyplot as plt 
import numpy as np
from sympy.ntheory import isprime
from sympy import sieve
from sympy import primepi


wb = Workbook()
zahl=10000
laufv=0
i=0

def ermittel_primteiler(x):
    primteiler_liste=[]
    for i in range(3,x//2,2):
        if x%i==0 and isprime(i):
            primteiler_liste.append(i)
    return(primteiler_liste)

ws=wb.active           
for n in range(3,zahl//2,10):
    i = i+1
    pendant=zahl-n-4
    laufv=zahl-pendant-4
    liste_laufv=ermittel_primteiler(laufv)
    liste_pendant=ermittel_primteiler(pendant)
    PTlaufv=""
    for x in liste_laufv:
        PTlaufv = PTlaufv+str(x)+", "
    PTpendant=""
    for y in liste_pendant:
        PTpendant = PTpendant+str(y)+", "
    ws.append([i,pendant,PTpendant,len(liste_pendant),laufv,PTlaufv,len(liste_laufv)])
wb.save("test1excel.xlsx")
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bykl: Also mal abgesehen davon das `PTlaufv` ein wirklich schlechter Name ist, gibt es die `join()`-Methode auf Zeichenketten für so etwas.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bykl: es ist müsig, immer wieder das selbe schreiben zu müssen. Benutze keine Abkürzungen, und schreibe Variablennamen komplett klein. Soll laufv wirklich laufvariable heißen? Einen nichtsagenderen Namen hast Du nicht gefunden?
Wenn pendant = zahl-n-4 ist und laufv = zahl - pendant - 4 ist, dann kann man das einfach einsetzen und bekommt laufv = zahl - (zahl-n-4) - 4 = zahl - zahl + n + 4 - 4 also laufv = n.
Strings setzt man nicht per + zusammen, sondern benutzt str.join.
x bzw y für ganze Zahlen ist ungewöhnlich. `return` ist keine Funktion, die Klammern also unsinnig.
matplotlib und numpy, sieve und primepi werden nicht benutzt.

Code: Alles auswählen

from openpyxl import Workbook
from sympy.ntheory import isprime

def ermittel_primteiler(zahl):
    primteiler = []
    for i in range(3, zahl//2, 2):
        if zahl % i == 0 and isprime(i):
            primteiler.append(i)
    return primteiler

workbook = Workbook()
worksheet = workbook.active           
maximalzahl = 10000
for index, zahl in enumerate(range(3, maximalzahl // 2, 10), 1):
    pendant = maximalzahl - zahl - 4
    primteiler_pedant = ermittel_primteiler(pedant)
    primteiler_zahl = ermittel_primteiler(zahl)
    worksheet.append([index,
        pendant, ", ".join(map(str, primteiler_pedant)), len(primteiler_pedant),
        zahl, ", ".join(map(str, primteiler_zahl)), len(primteiler_zahl),
    ])
workbook.save("test1excel.xlsx")
Bykl
User
Beiträge: 92
Registriert: Donnerstag 5. Oktober 2017, 17:57

@sirius die join-method hatte ich versucht. Sie war mein 1. Gedanke. Sie hat nicht funktioniert. Für die schlechte Namenswahl entschuldige ich mich. Es war auf die Schnelle passiert. Ich verändere das jetzt.

Man kann aber nicht alles mit einemmal behalten!

Code: Alles auswählen

from openpyxl import Workbook
from sympy.ntheory import isprime


wb = Workbook()
zahl=2000
ausgangs_zahl=0
i=0

def ermittel_primteiler(x):
    primteiler_liste=[]
    for i in range(3,x//2,2):
        if x%i==0 and isprime(i):
            primteiler_liste.append(i)
    return(primteiler_liste)

ws=wb.active           
for n in range(3,zahl//2,10):
    i = i+1
    pendant=zahl-n-4
    ausgangs_zahl=zahl-pendant-4
    liste_ausgangs_zahl=ermittel_primteiler(ausgangs_zahl)
    liste_pendant=ermittel_primteiler(pendant)
    pt_ausgangs_zahl=""
    for x in liste_ausgangs_zahl:
        pt_ausgangs_zahl = pt_ausgangs_zahl+str(x)+", "
    pt_pendant=""
    for y in liste_pendant:
        pt_pendant = pt_pendant+str(y)+", "
    ws.append([i,pendant,pt_pendant,len(liste_pendant),ausgangs_zahl,pt_ausgangs_zahl,len(liste_ausgangs_zahl)])
wb.save("test2excel.xlsx")
Jetzt fehlt nur noch die Idee, wie ich das letzte Komme in der PT-Zelle eleminiere? Fändet Ihr es besser, wenn ich den Code noch kommentiere?
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bykl: Die `join()`-Methode funktioniert. Die ist nicht so ineffizient, und hat auch nicht das Problem das da ein Trenner zu viel hinten dran gepappt wird.

Grunddatentypen wie `liste` haben in Namen eher nichts zu suchen. Denn wenn man den Datentyp ändert, beispielsweise weil ein vorhandener Datentyp besser passt oder man sich einen passenden selbst schreibt, ist der Name falsch, obwohl sich die Bedeutung des Wertes gar nicht geändert hat. Und dann hat man entweder falsche, irreführende Namen im Programm stehen, oder man muss das überall im Programm ändern.

Das definieren der Variablen am Anfang ist zu weit von dem Code entfernt der diese Namen dann tatsächlich verwendet. Zudem hat das alles nichts auf Modulebene zu suchen, denn damit sind das ja globale Variablen, die man nicht haben will.

`i` würde man besser mit der `enumerate()`-Funktion erzeugen, statt das manuell zu initialisieren und hoch zu zählen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum poste ich wohl einen verbesserten Code? Das beantwortet schon Deine Frage.
Antworten