Python Gleiche Zahl in 2 Mengen finden

Supersebe

Newbie
Registriert
März 2018
Beiträge
6
Hallo Liebe Community,

ich bin gerade (Just for fun) dabei, einen Teamspeak-Server in einer Datenbank wiederzuspiegeln. (Mittels einem Python Framework kann ich den TS3 über die Query auslesen).

Ich habe das bisher so Programmiert (Es geht hier gerade nur um Channel):
Wenn DB leer: Fülle DB mit den TS3-Daten
Wenn DB einen Channel hat, der nicht in der Menge der Channel ist, die vom TS3Bot ausgelesen wurden: Lösche Eintrag in der DB
Wenn TS3 einen Channel hat, der nicht in der Datenbank gespeichert ist: Füge Channel in die Datenbank ein
Wenn sich ein TS3 Channel ändert (anderer Name etc.): Update Eintrag in der DB

Um z.B. herauszufinden, ob die DB einen Channel besitzt, der gelöscht werden soll, muss ich aktuell jeden Channel der DB mit jeden Channel von der Menge der vom TS3Bot ausgelesenen Channel vergleichen.
Das kostet sehr viel Zeit.. Da ich dadurch einige For-Schleifen habe, braucht das Programm bei ein paar Channel mehr schon echt mehr Zeit.

Bevor ihr euch den Code anguckt: Ich bin noch Programmieranfänger, deshalb sind meine Variablenbenennungen nicht gut.
Ignoriert diese bitte. Ich werde den Code, wenn er funktioniert, nochmal deutlich überarbeiten, was die Lesbarkeit und die Benennungen angeht.

Python:
        #dbChannels sind die Channels, die von der DB kommen und tsChannels sind die Channels, die vom Bot gelesen wurden.

        dbChannels = self.db.readChannels()
        dbChannels = sorted(dbChannels, key=lambda k: k[2]) #Der Index 2 ist hier die Position der Channels

        for dbe in dbChannels:
            found = False
            for tse in tsChannels:
                if dbe[0] == tse['id']:    #Der Index 0 ist hier die ID des Channels
                    found = True

            if found == False:
                self.db.deleteChannel(dbe[0])
                for i in range(dbe[2], len(dbChannels)):
                    self.db.updateChannelsByPos(i, newPos=i-1)

Das Problem ist, dass der TS eine Liste von Dictionaries zurückgibt und die DB eine Liste von Listen.
Gibt es auch eine andere Möglichkeit, den zu löschenden Channel zu finden?



Edit:::: Ich habe die Möglichkeit mit "set" gefunden. Macht das Sinn oder gibt es noch bessere Möglichkeiten?
 
Zuletzt bearbeitet:
der weisheit nicht letzter schluss ohen set:
du könntest deine list of lists in ein dict konvertieren, durch das BotDict updaten lassen und, den Rest, den er in den keys des Bot Dicts nicht mehr findet, löschen.

Python:
myDB = [
    ['ch1', 'data1', 'data2', 'data3'],
    ['ch2', 'data2-1', 'data2-2', 'data2-3'],
    ['ch3','blabla']
]

myBot = {
    'ch1':['data1','data2','data3'],
    'ch2':['data'],
}

# convert DB data, if idx 0 of each list is the channel name
myDBdict = {}
for ch in myDB:
    myDBdict[ch[0]] = ch[1:]

# update DB dict
myDBdict.update(myBot)

# delete not existing channels
for key in list(myDBdict.keys()):
    if key not in list(myBot.keys()):
        myDBdict.pop(key)
 
Zurück
Oben