Seite 1 von 1

wie sucht man Teilstrings in Listen

Verfasst: Dienstag 22. Januar 2008, 15:07
von htw7448
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.

Verfasst: Dienstag 22. Januar 2008, 15:17
von gerold
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
:-)

Verfasst: Dienstag 22. Januar 2008, 15:22
von 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']

Verfasst: Dienstag 22. Januar 2008, 15:42
von htw7448
@ 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.

Verfasst: Dienstag 22. Januar 2008, 17:22
von 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)