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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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:

@ 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

`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)
Antworten