Übereinstimmungen in einer Liste feststellen / Python?
Mein Problem: Ich möchte aus einer Liste zum Teil gleiche Items erkennen. Etwas schwierig zu verstehen. Hier ein Beispiel:
[test.txt, test_np.txt, main.txt, main_np.txt]
In test.txt und test_np.txt steckt ja beides mal dieses test drin. Bei main das genau gleiche. Und das _np bleibt natürlich bei egal welchem Anfang
Ist es also irgendwie möglich zu erkennen das in zwei Strings in einer liste eine gleiche Buchstabenfolge oder Wort drinsteckt(und die dann einander zuzuordnen)?
Falls was unklar ist gerne melden!
Dankeschön schon mal im Vorraus.
3 Antworten
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)