Übereinstimmungen in einer Liste feststellen / Python?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet
zum Teil gleiche Items erkennen

Das ist weniger ein Programmierproblem als eine Frage der präzisen Spezifikation:

Bei "test_np.txt" und "main_np.txt" hast Du 7 gleiche Buchstaben, und alle Namen enden mit ".txt". Das ist aber vermutlich nicht, was Du als Treffer sehen willst. Beschreibe also zuerst ganz genau, was als Treffer gelten soll, bevor Du auch nur eine Zeile Code schreibst.

Ich könnte mir vorstellen, dass du die Strings als <Name><Variante>.<Endung> siehst und verschiedene Varianten zusammenfassen willst. Dann hilft es, alle Strings erst in diese Komponenten zu zerlegen und dann alle nach (Name, Endung) zu gruppieren. Mit einem regulären Ausdruck geht das recht komfortabel. So ungefähr könnte der Code dann aussehen:

from collections import defaultdict
import re

items = ["test.txt", "test_np.txt", "main.txt", "main_np.txt"]
groups = defaultdict(set)
pattern = re.compile("([a-zA-Z0-9]+)([^.]*)(.*)?")

for item in items:
    parts = pattern.match(item).groups()
    groups[ parts[0::2] ].add( item )

for key in groups:
    print(key, ":", groups[key])

Diese Zeilen sind in 5 Minuten geschrieben, aber den richtigen regulären Ausdruck darin zu finden kann Stunden oder sogar Tage dauern. Je genauer Du weißt, was er tun soll, desto schneller bist Du fertig.

Eine Möglichkeit wäre, die Strings in der Liste paarweise zu vergleichen und nach gemeinsamen Substrings zu suchen.

Beispielcode:

def find_common_substrings(lst):
    result = []
    for i in range(len(lst)):
        for j in range(i+1, len(lst)):
            # Suche nach gemeinsamen Substrings zwischen lst[i] und lst[j]
            common_substrings = set()
            for k in range(len(lst[i])):
                for l in range(k+1, len(lst[i])+1):
                    if lst[i][k:l] in lst[j]:
                        common_substrings.add(lst[i][k:l])
            # Wenn gemeinsame Substrings gefunden wurden, füge sie zum Ergebnis hinzu
            if len(common_substrings) > 0:
                result.append((lst[i], lst[j], common_substrings))
    return result

Dieser Code durchsucht die Liste lst nach gemeinsamen Substrings und gibt eine Liste von Tupeln zurück, die jeweils zwei Strings aus lst enthalten, die gemeinsame Substrings haben, sowie eine Menge von Substrings, die sie gemeinsam haben. Zum Beispiel könnte der Aufruf

find_common_substrings(['test.txt', 'test_np.txt', 'main.txt', 'main_np.txt'])

folgende Ausgabe liefern:

[('test.txt', 'test_np.txt', {'test'}), ('main.txt', 'main_np.txt', {'main'})]

Wie du also siehst, hat der Code erkannt dass "test" in test.txt und test_np.txt vorkam, diese gebündelt und einander zugeordnet. Dass gleiche dann mit main -> main_np.txt und main.txt.

Hi, ich antworde dir gerne, leider ist mir noch unklar wie und wo du die Strings gespeichert hast. Ausserdem empfhele ich dir, solche Fragen auf "Stack Overflow" zu stellen, da du da sicher besser aufgehoben bist (Ist etwa wie gutefrage, nur für programierer und halt auf englisch)