Liebes Forum,
ich habe bereits vergeblich versucht folgendes zu lösen:
Ich habe eine größere Anzahl (bis zu 50) String Variablen (jede Variable wurde mit dem Inhalt je einer Textdatei befüllt).
Ich möchte nun gerne wissen welche Variablen den gleichen Inhalt haben, und diese Information in eine neue Variable speichern.
Wenn z.B. var1, var30 und var 49 gleichen Inhalts sind, würde ich gerne soetwas wie
"erstes Vorkommen von Variablen die gleich sind: var1, var30, var49"
"zweites Vorkommen von Variablen die gleich sind: [...]"
ausgeben.
Eine mehr oder weniger detaillierte Skizze, als Schups in die richtige Richtung, würde mir sehr helfen.
String Variablen sortieren
du könntest die liste erstmal sortieren (liste.sort()) dann stehen alle gleichen direkt nebeneinander und du bist fast fertig.
dann müssen die gleichen texte aber auch exact gleich sein. ist das der fall?
falls nein, könntest du ähnliche strings mit difflib finden.
dann müssen die gleichen texte aber auch exact gleich sein. ist das der fall?
falls nein, könntest du ähnliche strings mit difflib finden.
http://www.kinderpornos.info
Ich fürchte, das hilft hier nicht, weil es anscheinend gar nicht um eine Liste geht, sondern tatsächlich um 50 einzelne Variablen mit den Namen var1, var2, ..., var50. Da ist wohl schon vorher irgend etwas schief gelaufen ...Dill hat geschrieben:du könntest die liste erstmal sortieren (liste.sort()) dann stehen alle gleichen direkt nebeneinander und du bist fast fertig.
Danke für den guten Tipp! Ja, der Inhalt ist exakt gleich.
Nun habe ich dies hier (nur als Beispiel):
ausgabe vor liste.sort()
inhalt, istanders, inhalt, inhalt
ausgabe nach liste.sort()
inhalt, inhalt, inhalt, istanders
Leider komme ich noch nicht drauf wie ich hieraus nun etwas wie
"erstes Vorkommen von Variablen die gleich sind: var1, var3, var4"
ausgeben kann.
Nun habe ich dies hier (nur als Beispiel):
Code: Alles auswählen
var1 = "inhalt"
var2 = "istanders"
var3 = "inhalt"
var4 = "inhalt"
liste=[var1, var2, var3, var4]
print liste
liste.sort()
print liste
ausgabe vor liste.sort()
inhalt, istanders, inhalt, inhalt
ausgabe nach liste.sort()
inhalt, inhalt, inhalt, istanders
Leider komme ich noch nicht drauf wie ich hieraus nun etwas wie
"erstes Vorkommen von Variablen die gleich sind: var1, var3, var4"
ausgeben kann.
Durchlaufen und dir jeweils den Index der ersten "neuen" Variable merken. Sobald du auf eine Variable stößt, deren Inhalt nicht mit der vorherigen identisch ist, mußt du diesen Index neu setzen (nachdem du zuvor vermutlich noch irgendwas mit der damit vollständigen Gruppe von inhaltsgleichen Variablen angestellt hast).
@markus073: Wenn Du tatsächlich 50 fortlaufend nummerierte Namen in Deinem Programm hast, solltest Du als aller erstes diese Namen beseitigen. Statt Namen mit Nummern will man in der Regel an der Stelle eine Liste verwenden, also *einen* Namen, wo die Nummern in Form von Indizes angegeben werden können. Spart viel Schreibarbeit, und man hat auch gleich eine Datenstruktur mit der man weiterarbeiten kann.
Als nächsten Schritt müsstest Du ein Dictionary anlegen, das die Texte als Schlüssel enthält und eine Liste mit Indizes an denen der jeweilige Text steht, als Werte.
Nützliche Wertzeuge dafür: Die ``for``-Anweisung, die `enumerate()`-Funktion, und die Typen `collections.defaultdict` und `list`.
Als nächsten Schritt müsstest Du ein Dictionary anlegen, das die Texte als Schlüssel enthält und eine Liste mit Indizes an denen der jeweilige Text steht, als Werte.
Nützliche Wertzeuge dafür: Die ``for``-Anweisung, die `enumerate()`-Funktion, und die Typen `collections.defaultdict` und `list`.
Vielleicht hilft dir das:
Code: Alles auswählen
from itertools import groupby
var = ["inhalt", "istanders", "blubb", "inhalt", "inhalt", "blubb"]
index_sorted = sorted(range(len(var)), key=var.__getitem__)
print sorted(list(g) for k, g in groupby(index_sorted, key=var.__getitem__))
Code: Alles auswählen
[[0, 3, 4], [1], [2, 5]]
Wobei mir das für "Produktionscode" zuviel Magie ist. Auf `__foo__`-Methoden greife ich ungerne direkt zu.
Ja, da hast du wohl recht. Extra eine Funktion zu definieren finde ich aber auch hässlich und umständlich für die paar Zeilen Wegwerfcode.
Die von dir vorgeschlagene Lösung ist ohnehin verständlicher. Ich dachte zuerst, dass das Gruppieren von gleichen Element doch ein Job für groupby wäre, aber es ist leider doch komplizierter.
Abgesehen davon: Es ist schade, dass man sorted (u.ä.) zwar eine key-Funktion übergeben kann, aber nicht einfach ein iterable, das die Schlüssel liefert ("keys=var").
Die von dir vorgeschlagene Lösung ist ohnehin verständlicher. Ich dachte zuerst, dass das Gruppieren von gleichen Element doch ein Job für groupby wäre, aber es ist leider doch komplizierter.
Abgesehen davon: Es ist schade, dass man sorted (u.ä.) zwar eine key-Funktion übergeben kann, aber nicht einfach ein iterable, das die Schlüssel liefert ("keys=var").
Herzlichen Dank an alle für die guten Tipps. Natürlich habt Ihr Recht, dass nur ein Dictionary Sinn macht.
Ich gebe es jetzt etwa so aus, welche Textfiles den gleichen Inhalt haben:
Ich gebe es jetzt etwa so aus, welche Textfiles den gleichen Inhalt haben:
Code: Alles auswählen
d = { "txt1": "inhaltA",
"txt2": "inhaltB",
"txt3": "inhaltA",
"txt4":"inhaltA",
"txt5": "inhaltC",
"txt6":"inhaltB",
"txt7":"inhaltA"}
pairs = sorted((value, key) for (key, value) in d.iteritems())
for value, key in pairs:
print value, key
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Wenn deine Keys (txtN) wirklich nur nach dem Schema N=1, 2, 3, ...10000 verlaufen, brauchst du auch kein Dictionary - was du willst ist eine Liste:
Die kannst du dann per Index benutzen:
Code: Alles auswählen
["a", "b", "c", "d", "e"]
Code: Alles auswählen
liste[0], liste[5757]
ich hab dazu mal ein Beispiel:
es ist zwar nicht so kurz, aber es beschränkt sich auf die Grundbegriffe, was ja auch mal ganz praktisch zum Verstehen ist
Grüße
Pascal
es ist zwar nicht so kurz, aber es beschränkt sich auf die Grundbegriffe, was ja auch mal ganz praktisch zum Verstehen ist
Code: Alles auswählen
woerter = ['hallo', 'ich','einen', 'hab','auch','einen','einen', 'Loesungsvorschlag', 'ich' ,'hallo']
doppelte_woerter=[]
for wort in woerter:
if not wort in doppelte_woerter and woerter.count(wort) !=1:
doppelte_woerter.append(wort)
print wort , 'befindet sich ' , woerter.count(wort), 'mal in der Liste'
Pascal
Auch wichtig zu verstehen ist, warum man dass da auf keinen Fall ernsthaft in Betracht ziehen sollte. Das Laufzeitverhalten ist ja gruselig.