Liste in Dictionary formatieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
WorldPark
User
Beiträge: 5
Registriert: Donnerstag 14. Februar 2019, 11:37

Hallo,

ich versuche in meiner Freizeit das programmieren mit Python zu lernen. Neben dem Absolvieren von Tutorials habe ich mir als Ziel gesetzt, ein kleines Programm zu erstellen. Es soll bei mir bei der Arbeit einen Arbeitsplan erstellen und ausgeben, wer an welchem Tag arbeiten muss. Das ganze ist kein Teil meiner Arbeit, sondern war nur eine Anwendungsidee von mir. Nun zum Problem:

Meine Idee ist es, einen Monat über

Code: Alles auswählen

import datetime
import calendar
ls_month = calendar.monthcalendar(2019,10)
zu laden. Dadurch erhalte ich eine Liste, mit den entsprechenden Wochentagen. Diese Liste würde ich jetzt gerne in ein dictionary formatieren, um dann jeden Tag einen meiner Kollegen zu ordnen zu können. Leider habe ich dazu bis jetzt noch nichts gefunden, was ich auch verstehen konnte. Meine Frage ist, wie kann ich jetzt ls_month in ein dictionary umwandeln, wobei die Wochentage die keys sein sollen?

Freue mich auf eure Antworten.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist Dir beim füllen eines Wörterbuchs mit Schlüssel-Wert-Paaren nicht klar?
Denn für ein Wörterbuch brauchst Du ja auch die Werte.
Woher kommen die? Wie soll das Ergebnis zum Schluß aussehen?
WorldPark
User
Beiträge: 5
Registriert: Donnerstag 14. Februar 2019, 11:37

Sirius3 hat geschrieben: Samstag 14. September 2019, 15:02 Was ist Dir beim füllen eines Wörterbuchs mit Schlüssel-Wert-Paaren nicht klar?
Denn für ein Wörterbuch brauchst Du ja auch die Werte.
Woher kommen die? Wie soll das Ergebnis zum Schluß aussehen?
Es sollen die Präferenzen meiner Kollegen eingegeben werden. Zum Beispiel können einige nur an bestimmten Wochentagen oder an einem bestimmten Tag gar nicht. Hier geht es mir aber erstmal nur darum, die Schlüssel zu bekommen. Also dass das ganze dann so aussieht:

Code: Alles auswählen

ls_month = {0:; 1:; 2:; 3:; ...}
und nicht mehr so:

Code: Alles auswählen

ls_month = [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 31, 0, 0, 0]]
Edit:
Das ist mein ganzer Code bis jetzt, falls es dich interessiert :) :

Code: Alles auswählen

#kann später oben importiert werden
import datetime
import calendar


class coworker: #Grundgerüst für alle Mitarbeiter
        name = []
        preferences_weekdays = []
        preferences_specific_days = []
        unavailable_weekdays = []
        unavailable_specific_days = []
        days = 6
        more_days = 1

        def __init__(self, name, preferences_weekdays, preferences_specific_days, unavailable_weekdays, unavailable_specific_days, days, more_days):    #den einzelnen Mitarbeitern werden wesentliche Eigenschaften zugeordnet
            self.name = name
            self.preferences_weekdays = preferences_weekdays
            self.preferences_specific_days = preferences_specific_days
            self.unavailable_weekdays = unavailable_weekdays
            self.unavailable_specific_days = unavailable_specific_days
            self.days = days
            self.more_days = more_days

#die einzelnen Mitarbeiter werden definiert
Tobias = coworker("Tobias","Mo",None,None,None,7,True)
Robert = coworker("Robert","Mo, Di",None,None,None,7,True)

#es wird ein Dictonary erstellt, das angebit, wer werlchen Tag bevorzugt
ls_coworker = [Tobias, Robert]
ls_five_days = ["Mo", "Di", "Mi", "Do", "Fr"]

week = {"Mo": None, "Di": None, "Mi": None, "Do": None, "Fr": None}

def compare_preferences():
    for person in ls_coworker:
        for day in ls_five_days:
            person.preferences_weekdays
            if day in person.preferences_weekdays:
                if week[day] == None:
                    week[day] = person.name
                else: week[day] = week[day] + ", " + person.name

compare_preferences()
print(week)

ls_month = calendar.monthcalendar(2019,10)
print(ls_month)
print(dict(ls_month[0]))
print(len(ls_month))

"""
def specific_days():

"""
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein Wörterbuch ohne Werte ist nicht sinnvoll.
Also was willst Du mit dem Wörterbuch machen?
So wie es aussieht, willst Du sowieso nur aufsteigende Zahlen bis maximal 31. Dafür ist eine Liste besser geeignet.
WorldPark
User
Beiträge: 5
Registriert: Donnerstag 14. Februar 2019, 11:37

Sirius3 hat geschrieben: Samstag 14. September 2019, 15:21 Ein Wörterbuch ohne Werte ist nicht sinnvoll.
Also was willst Du mit dem Wörterbuch machen?
So wie es aussieht, willst Du sowieso nur aufsteigende Zahlen bis maximal 31. Dafür ist eine Liste besser geeignet.
Da soll halt darauf Aufbauend sowas rauskommen wie:

ls_month = {0: None; 1: "Müller"; 2: "Schmidt"; 3: "Schmidt; 4: "Jansen" ...}

Aber die Zuteilung der Schlüssel möchte ich später über Funktionen durchführen.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Anmerkungen zum Code:

In Python werden Klassen Gross geschrieben, also CoWorker.
Die ganzen Klassenattribute sind unsinnig und können weg. Eine Liste als Name ist auch etwas seltsam.
Eine Liste an Wochentagen sollte auch eine Liste sein, und kein String mit Komma getrennten Tagen. Später nimmst Du ja auch an, dass `preferences_weekdays` eine Liste ist.

Die Funktion `compare_preferences` vergleicht gar nichts. Funktionen sollten alles, was die brauchen, über ihre Argumente bekommen, also `ls_coworker`, `ls_five_days` und `week`.
Was soll eigentlich diese `ls_` bedeuten? Für Variablennamen keine kryptischen Abkürzungen benutzen. Falls das `Liste` heißen soll, keine Datentypen in den Namen schreiben, dass es sich um etwas handelt, wo mehrere Elemente drin stehen, erkennt man am Plural, also five_days, oder coworkers. Da `week` in der Funktion geändert wird, wäre es besser, dass Du es gar nicht übergibst, sondern ein neues Wörterbuch erzeugst, und dieses zurück gibst.

Die gleiche Information steckt in den Schlüsseln von week und in five_days. Das eine sollte aus dem anderen erzeugt werden. Statt in week Werte zu speichern, die komma-separierte Strings sind, sollten das wieder Listen sein.

Code: Alles auswählen

import datetime
import calendar

WORK_DAYS = ["Mo", "Di", "Mi", "Do", "Fr"]

class CoWorker:
        def __init__(self, name, preferences_weekdays, preferences_specific_days, unavailable_weekdays, unavailable_specific_days, days, more_days): 
            # den einzelnen Mitarbeitern werden wesentliche Eigenschaften zugeordnet
            self.name = name
            self.preferences_weekdays = preferences_weekdays
            self.preferences_specific_days = preferences_specific_days
            self.unavailable_weekdays = unavailable_weekdays
            self.unavailable_specific_days = unavailable_specific_days
            self.days = days
            self.more_days = more_days

def generate_weekday_preferences(coworkers):
    weekday_preferences = {day:[] for day in WEEK_DAYS}
    for person in coworkers:
        for day in person.preferences_weekdays:
                weekday_preferences[day].append(person)
    return weekday_preferences

def main():
    #die einzelnen Mitarbeiter werden definiert
    coworkers = [
        CoWorker("Tobias",["Mo"],None,None,None,7,True),
        CoWorker("Robert",["Mo", "Di"],None,None,None,7,True),
    ]
    weekday_preferences = generate_weekday_preferences(coworkers)
    print(weekday_preferences)

    month_days = calendar.monthcalendar(2019,10)
    print(month_days)

if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde aus den Wochen(arbeits)tagen eventuell auch ein `enum.Enum` oder `enum.Flag` machen. Dann haben die einen eigenen Typ, man kann sich nicht vertippen ohne das es kracht, und bei `Flag` hätte man dann auch gleich Mengenoperationen. Und beim erstellen auch nicht so viele ”anonyme” `None` Werte.

Vielleicht sollte man sich auch gleich mal mit `dateutils` auseinandersetzen, denn das was da gemacht wird, will man vielleicht eher nicht selbst noch mal erfinden. Und das hat sicher auch Einfluss darauf wie man die Daten strukturiert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten