vergleichen von 2 Listen

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
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

Ich haben 2 Tabellen:
1. Tabelle;
Name1, kann: laufen, rennen
Name2, kann; nix

2. Tabelle
Name2, kann rennen, gehen
Name1, kann laufen, gehen
Name3, kann nix

Ergebnis: Tabelle1+2
Name2, kann rennen, gehen
Name1, kann laufen, rennen, gehen
Name3, kann nix

Namenreihenfolge ist egal dabei.
ich hatte da an sowas wie set(tabelle1).union(set(tabelle2) gedacht.
allerdings wie kriege ich die Fähigkeiten noch dazu ?
irgendwie habe ich da eine Denkblockade :D
hat da einer eine Idee ? Danke !
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Das ist keine Menge von Namen, sondern eine Abbildung von Namen auf Fähigkeiten. Also bietet sich ein Wörterbuch an, das Namen auf Fähigkeiten abbildet. Die Fähigkeiten könnte man dann als Menge repräsentieren, weil die die ja erweitern können muss, ohne das doppelte entstehen.

Und wie immer: Problem in kleinere Teilprobleme zerlegen, solange wiederholen bis die Teilprobleme so klein sind, dass man sie jeweils mit wenigen Zeilen Code in einer Funktion lösen kann, Funktion/Teillösung testen, weitermachen bis man aus den Teillösungen eine Gesamtlösung zusammengebaut hat.

Übliche Punkte an denen man Probleme zerlegen kann: Eingabe, Verarbeitung, Ausgabe, und wenn man mehrere Sachen gleichartig verarbeiten kann/muss, die Verarbeitung von einer Sache herausziehen, so dass man wenn das läuft, nur noch eine Schleife (oder Funktion höherer Ordnung) braucht um die Verarbeitung auf alle Sachen anzuwenden.

Man könnte beispielsweise eine Funktion zum einlesen einer Tabelle schreiben. Die eine Funktion verwenden könnte, die einen einzelnen Datensatz beispielsweise in ein Tupel aus Name und Menge von Fähigkeiten parst. Zu beiden Operationen kann man auch die Umkehrfunktion schreiben. Dann könnte man schon mal Tabellen einlesen und unverändert wieder schreiben. Dann braucht man nur noch eine Funktion die zwei Tabellen zu einer verbindet. Und dann ist das ja eigentlich schon gelöst.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import re
from collections import defaultdict

CAPABILITIES_RE = re.compile(r"\s*kann[:;]?\s+(?P<capabilities>.*)")


def parse_line(line):
    name, capabilities_text = line.strip().partition(",")
    capabilities = (
        CAPABILITIES_RE.fullmatch(capabilities_text)
        .group("capabilities")
        .split(",")
    )
    return name.rstrip(), set([] if capabilities == ["nix"] else capabilities)


def parse_lines(lines):
    return map(parse_line, lines)


def format_record(record):
    name, capabilities = record
    capabilities_text = ", ".join(capabilities) if capabilities else "nix"
    return f"{name}, kann {capabilities_text}\n"


def main():
    name_to_capabilities = defaultdict(set)
    for filename in ["table_one.txt", "table_two.txt"]:
        with open(filename, encoding="utf-8") as lines:
            for name, capabilities in parse_lines(lines):
                name_to_capabilities[name].update(capabilities)

    with open("result.txt", "w", encoding="utf-8") as file:
        file.writelines(map(format_record, name_to_capabilities.items()))


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten