Listenelemente innerhalb einer Liste vergleichen

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
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Hallo!
Ich habe eine Liste, deren einzelne Elemente bestehen jeweils aus drei Wörtern, also aus einem String, bestehend aus 3 Wörtern.
Ich würde nun gerne prüfen ob innerhalb dieser Liste zwei oder mehrals der gleiche String vorkommt.

Also:

Code: Alles auswählen

list=["Hallo wie gehts", "Mir gehts gut", "ist nett heute", "Mir gehts gut","Sonne, Mond, Sterne","die Sonne scheint", "Sonne, Mond, Sterne", "Sonne, Mond, Sterne", "funktioniert doch nicht","gleich ist Pause","es gibt vieles","es gibt Tage"]
for o in list:
	print(o)
	if o==o:
		print(o, kommt mehrmals vor.)
Leider funktioniert das aber nicht. Ich habe ir das mal angeguckt, wie man Elemente aus zwei Listen miteinander vergleicht. Aber so richtig ist das auf mein Problem nicht zu übertragen und da die Elemente ja theoretisch beliebig oft, also doppelt, dreifach, vierfach,...auftretetn können müsste ich dann ja auch unendlich viele identische Liste erstellen.

Hat jemand eine Idee, wie ich mein Problem lösen könnte?
Danke schon mal, freue mich über jede Hilfe!
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Also Wichtig ist, ich möchte nicht, dass die einzelnen Elemente nachher nur noch einmal vorkommen, das könnte man mit einer Menga ja gut hinkriegen. Mir ist wichtig, dass ich nachher wirklich sagen kann, wie oft ein Element in der Liste wirklich vorkommt...
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Noranora: schau Dir collections.Counter an.
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Danke!
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Das mit dem Zählen klappt super! Habe es so gemacht:

Code: Alles auswählen

import collections
from collections import Counter

list=["Hallo wie gehts", "Mir gehts gut","Sonne, Mond, Sterne", "die Sonne lacht","die Sonne weint", "ich sehe Sonne","ist nett heute", "Mir gehts gut","Sonne, Mond, Sterne","die Sonne scheint", "Sonne, Mond, Sterne", "Sonne, Mond, Sterne", "funktioniert doch nicht","gleich ist Pause","es gibt vieles","es gibt Tage"]
cnt=Counter()
cnt.update(list)
print(cnt)

Allerdings stoße ich jetzt schon an mein nächstes Problem :oops: :?
Ich wollte eigentlich so zählen, dass man prüft ob ein Wort in den "dreierstrings" auftritt und dann für jedes Element, welches dieses Wort beinhaltet zählt, wie oft dieses Element, also dieser "dreierString" vorkommt.

habe das mal für das Wort Sonne ausprobiert. Aber ich bekomme dann immer nur die Buchstaben der Strings gezählt, nicht aber, wie oft der String, also das eine Element in der Liste vorkommt.


Ich habe es so probiert:

Code: Alles auswählen

import collections
from collections import Counter

list=["Hallo wie gehts", "Mir gehts gut","Sonne, Mond, Sterne", "die Sonne lacht","die Sonne weint", "ich sehe Sonne","ist nett heute", "Mir gehts gut","Sonne, Mond, Sterne","die Sonne scheint", "Sonne, Mond, Sterne", "Sonne, Mond, Sterne", "funktioniert doch nicht","gleich ist Pause","es gibt vieles","es gibt Tage"]
cnt=Counter()
for i in list:
    if "Sonne" in i:
        #print(i)
        cnt.update(i)
    print(cnt)

raus kommt dan soetwas ( ich habe das gekürzt) :

Counter()
Counter()
Counter({'n': 4, 'e': 3, ' ': 2, ',': 2, 'o': 2, 'S': 2, 'd': 1, 'M': 1, 'r': 1, 't': 1})
Counter({'n': 6, 'e': 5, ' ': 4, 'o': 3, 'S': 3, 'd': 2, ',': 2, 't': 2, 'a': 1, 'c': 1, 'i': 1, 'h': 1, 'M': 1, 'r': 1, 'l': 1})
Counter({'n': 9, 'e': 8, ' ': 6, 'o': 4, 'S': 4, 'd': 3, 'i': 3, 't': 3, ',': 2, 'a': 1, 'c': 1, 'h': 1, 'M': 1, 'r': 1, 'w': 1, 'l': 1})
Counter({'e': 11, 'n': 11, ' ': 8, 'o': 5, 'S': 5, 'i': 4, 'd': 3, 'h': 3, 't': 3, 'c': 2, ',': 2, 'a': 1, 'M': 1, 's': 1, 'r': 1, 'w': 1, 'l': 1})


Erhofft hatte ich mir eigentlich, dass dann wie oben da steht: "Sonne, Mond, Sterne" : 4, "die Sonne lacht":1 ....halt auschließlich für die Elemente in denen das Wort "sonne" vorkommt.
Jemand eine Idee? :oops:
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

AHHHHH! :D :D :D
Ich hab es hinbekommen! Danke für euren Beistand!

Habe es jetzt mit einer zusätzlichen Liste gemacht^^

Code: Alles auswählen

liste=zweierkette

cnt=Counter()
neu_list=[]
for i in liste:
    if "experience" in i:
        neu_list.append(i)
for element in neu_list:
    cnt=Counter()
cnt.update(neu_list)
print(cnt)

Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oder kompakter:

Code: Alles auswählen

all_words = ["Hallo wie gehts", "Mir gehts gut","Sonne, Mond, Sterne", "die Sonne lacht","die Sonne weint", "ich sehe Sonne","ist nett heute", "Mir gehts gut","Sonne, Mond, Sterne","die Sonne scheint", "Sonne, Mond, Sterne", "Sonne, Mond, Sterne", "funktioniert doch nicht","gleich ist Pause","es gibt vieles","es gibt Tage"]
cnt = Counter(words for words in all_words if "Sonne" in words)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier ein Beispiel, wie man das für mehrere Counter erweitern könnte:

Code: Alles auswählen

from collections import Counter

def get_counters(sequences, needles):
    counters = {}
    for needle in needles:
        counter = Counter(
            seq for seq in sequences if needle in seq
        )
        counters[needle] = counter
    return counters

def main():
    sequences = ["Hallo wie gehts", "Mir gehts gut","Sonne, Mond, Sterne", "die Sonne lacht","die Sonne weint", "ich sehe Sonne","ist nett heute", "Mir gehts gut","Sonne, Mond, Sterne","die Sonne scheint", "Sonne, Mond, Sterne", "Sonne, Mond, Sterne", "funktioniert doch nicht","gleich ist Pause","es gibt vieles","es gibt Tage"]

    counters = get_counters(sequences, ["Sonne", "gehts"])
    print(counters["Sonne"])
    print(counters["gehts"])


if __name__ == "__main__":
    main()
Natürlich kann man die Funktion auch so schreiben, dass sie nur einen Counter für das jeweilige Wort zurückliefert. Dann würde sich der Aufrufer entsprechend um das Sammeln der Counter (also z.B. in einem `dict`) kümmern und würde die Funktion eben mehrfach mit unterschiedlichen Angaben für `needle` aufrufen.

Dann wäre die Funktion aber auch ein Einzeiler und man würde sich überlegen, ob man dann noch extra eine Funktion drum herum benötigt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@noranora: Da du dich mit NLP zu beschaeftigen scheinst, solltest du dir wirklich anschauen, wie nltk funktioniert.
Dein letztens Problem haettest du mit `nltk.trigram` bzw `nltk.ngram` loesen koennen und fuer das aktuelle gibt es `nltk.FreqDist`.

Das Buch dazu ist wirklich sehr brauchbar: http://www.nltk.org/book_1ed/
Antworten