wie sucht man Teilstrings in 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.
htw7448
User
Beiträge: 51
Registriert: Montag 16. April 2007, 10:59
Wohnort: Messel(Hessen)
Kontaktdaten:

wie sucht man Teilstrings in Listen

Beitragvon htw7448 » Dienstag 22. Januar 2008, 15:07

Habt ihr einen Tipp wie man Teilstrings in Listen sucht und sich den kompletten String des zurückgegebenen Indexes ausgeben lassen kann?

z.B.

Code: Alles auswählen

l1 = ['haus am strand', 'baum in der wüste', 'spiegel in den dünen', 'haus in ny']

l2 = ['haus', 'strand, 'baum'] # Suchstrings

#- > l3 = ['haus am strand', 'baum in der wüste', 'haus in ny']


l3 soll herauskommen. Immer wenn der String Teil eines Strings in l1 ist soll der String aus l1 an l3 angefügt werden.

kann man hier nur mit einem:

for i in l2:
for k in l1: Konstrukt arbeiten?

s.startswith und ''in'' sollten hier nicht funktionieren da der l2-String ja überall vorkommen kann bz. nur ein Index zurückgeliefert wird.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 22. Januar 2008, 15:17

Hallo htw7448!

Eine Möglichkeit:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

l1 = ['haus am strand', 'baum in der wüste', 'spiegel in den dünen', 'haus in ny']
l2 = ['haus', 'strand', 'baum'] # Suchstrings
l3 = []
for source_item in l1:
    for search_item in l2:
        if search_item in source_item:
            l3.append(source_item)
            break

print l3 # ['haus am strand', 'baum in der wüste', 'haus in ny']

Es geht natürlich auch kürzer... und seit Python 2.5 haben sich die möglichen Lösungswege vermehrt. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Beitragvon BlackJack » Dienstag 22. Januar 2008, 15:22

Code: Alles auswählen

In [85]: [s for s in l1 if any(needle in s for needle in l2)]
Out[85]: ['haus am strand', 'baum in der w\xc3\xbcste', 'haus in ny']
htw7448
User
Beiträge: 51
Registriert: Montag 16. April 2007, 10:59
Wohnort: Messel(Hessen)
Kontaktdaten:

Beitragvon htw7448 » Dienstag 22. Januar 2008, 15:42

@ gerold: Danke für deine Antwort, diese etwas langsame Variante wollte ich nicht nehmen :D

nun bin ich aber baff BlackJack. Kannst du das any(needle in s for needle in l2) ein wenig näher erklären. Seit wann gibt es ´´any´´ ?.

hm das Script läuft bei mir auch nicht durch der stört sich am any. Ich verwende übrigens Python 2.5.
BlackJack

Beitragvon BlackJack » Dienstag 22. Januar 2008, 17:22

`any()` gibt's seit 2.5, das sollte also dann eigentlich kein Problem machen. Die Funktion bekommt ein "iterable" und gibt `True` zurück, wenn mindestens ein Element "wahr" ist.

Bei 2.4 würde ich die Funktion so implementieren:

Code: Alles auswählen

from itertools import imap

def any(iterable):
    return True in imap(bool, iterable)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]