Seite 1 von 1

Listen durch Schleife erzeugen

Verfasst: Freitag 24. Mai 2019, 22:13
von Birnenkern
Guten Abend Python-Gemeinde,

mein Problem: Ich möchte gerne viele Listen mithilfe einer For-Schleife erzeugen, es geht darum das ich eine menge Namen in einer Excel Datei habe und diese nun unter Team 1, Team 2 etc einspeichern möchte...
Für das Auslesen der Excel verwende ich openpyxl.

Bei meiner Frage geht es lediglich darum wie ich listen nicht manuell erstelle sondern sie mir durch eine schleife erstellen lassen so dass ich einen String mit "Team" habe und anschließend die Variable x mit 1,2,3,4 und so weiter..

An Code habe ich einiges versucht bin aber mächtig am verzweifeln.. Aktuell schaut die Funktion wie folgt aus:
Ja ich verstehe dass der Code so leider aktuell nicht funktioniert aber vielleicht sehr ihr mein problem hier deutlicher:

Code: Alles auswählen

	def teamlistenerstellen(self):
		counterfuerteamname = 0
		for row in range(1, self.sheet.max_row + 1):
			counterfuerteamname += 1
			test = self.sheet.cell(1,row)
			"Team" + str(counterfuerteamname) = list(test.value)	#hier soll eig. eine Liste erzeugt werden... (diese Zeile mag ich ausbessern mit eurer Hilfe)
			print(test)
Für erfahrene Nutzer wird dies vermutlich sehr einfach sein.

Ich danke euch schon jetzt!

Re: Listen durch Schleife erzeugen

Verfasst: Samstag 25. Mai 2019, 00:51
von __blackjack__
@Birnenkern: Du willst keine durchnummerierten Variablennamen, und schon gar nicht dynamisch erzeugen, sondern eine Liste mit Listen.

Bei `counterfuerteamname` (und beim Methodennamen) fehlen Unterstriche damit man das lesen kann. Der Wert ist auch redundant, weil das immer der gleiche wie `row` ist:

Code: Alles auswählen

    def erstelle_teamlisten(self):
        teams = list()
        for row in range(1, self.sheet.max_row + 1):
            teams.append(list(self.sheet.cell(1, row).value))
        
        # ...
Beziehungsweise mit einer „list comprehension“:

Code: Alles auswählen

    def erstelle_teamlisten(self):
        teams = [
            list(self.sheet.cell(1, row).value)
            for row in range(1, self.sheet.max_row + 1)
        ]
        # ...

Re: Listen durch Schleife erzeugen

Verfasst: Samstag 25. Mai 2019, 21:16
von Birnenkern
__blackjack__ hat geschrieben: Samstag 25. Mai 2019, 00:51 @Birnenkern: Du willst keine durchnummerierten Variablennamen, und schon gar nicht dynamisch erzeugen, sondern eine Liste mit Listen.

Bei `counterfuerteamname` (und beim Methodennamen) fehlen Unterstriche damit man das lesen kann. Der Wert ist auch redundant, weil das immer der gleiche wie `row` ist:

Code: Alles auswählen

    def erstelle_teamlisten(self):
        teams = list()
        for row in range(1, self.sheet.max_row + 1):
            teams.append(list(self.sheet.cell(1, row).value))
        
        # ...
Beziehungsweise mit einer „list comprehension“:

Code: Alles auswählen

    def erstelle_teamlisten(self):
        teams = [
            list(self.sheet.cell(1, row).value)
            for row in range(1, self.sheet.max_row + 1)
        ]
        # ...
Vielen Dank! Das hat mir sehr geholfen. Allerdings speichert er jeden Buchstaben in einem einzelnem String: Team 1 -> [T,e,a,m," ", 1] etc. Gibt es da eine Funktion diese Strings zu einem zusammenzufügen?

Re: Listen durch Schleife erzeugen

Verfasst: Samstag 25. Mai 2019, 21:30
von Sirius3
@Birnenkern: das machst Du doch (un-)absichtlich selbst, indem Du den Wert der Zelle in eine Liste umwandelst `list(test.value)`.

Code: Alles auswählen

>>> list("Team 1")
['T', 'e', 'a', 'm', ' ', '1']
Wenn Du das nicht willst, lass das einfach sein.

Re: Listen durch Schleife erzeugen

Verfasst: Donnerstag 6. Juni 2019, 12:06
von DeaD_EyE
Dann mach den Code doch einfacher:

Code: Alles auswählen

def teamlistenerstellen(self):
    start = 1
    end = self.sheet.max_row + 1
    fmt = 'Team {num}: {name}'
    for row in range(start, end):
        team = self.sheet.cell(1, row).value
        print(fmt.format(num=row, name=team))
Wenn die Funktion eine Liste ausgeben soll, musst du vorher erst eine erstellen und dann fügst du die Elemente mit jeder Iteration zur bestehenden Liste hinzu.

Code: Alles auswählen

def teamlistenerstellen(self):
    teams = [] # leere liste
    start = 1
    end = self.sheet.max_row + 1
    fmt = 'Team {num}: {name}'
    for row in range(start, end):
        team = self.sheet.cell(1, row).value
        teams.append(team) # element zur bestehende Liste hinzufügen
    return teams # fertige Liste mit Teamnamen ausgeben