2016-05-29 15 views
3

Ich habe zwei Sätze:Python Kreuzung mit Substrings

a = set(['this', 'is', 'an', 'apple!']) 
b = set(['apple', 'orange']) 

möchte ich finden, ob es eine (b) in (a) einschließlich Teil. normalerweise würde ich tun:

c = a.intersection(b) 

in diesem Beispiel jedoch wäre es eine leere Menge als ‚Apfel‘ = Return ‚Apfel‘

Angenommen, ich kann Zeichen aus (a) nicht entfernen und hoffentlich ohne Schleifen zu erstellen, gibt es eine Möglichkeit für mich, eine Übereinstimmung zu finden?

Edit: Ich möchte dafür eine Übereinstimmung von (b) z. Ich würde gerne wissen, ob "Apfel" im Set ist (a), ich möchte nicht, dass es "Apfel" zurückgibt.

Antwort

3

Statt die Gleichheitsprüfung über == zu tun, können Sie in für Teilzeichenfolge Spiel verwendet werden, die auch die Gleichstellung umfasst:

>>> [x for ele in a for x in b if x in ele] 
["apple"] 
+0

Das funktioniert, aber es scheint ["Apfel!"] Zurückzukehren. Wie kann ich es zurückbringen ["Apfel"]? –

+0

Sie sollten das erste 'ele' in' x' ändern, das im Grunde die Elemente von 'b' statt von' a' sammelt. Der Code wurde aktualisiert. – ozgur

+0

Brilliant, danke für Ihre Hilfe. Ich bin neu bei Python und habe das vorher nicht gesehen. –

0

Das Beste, was zu tun ist:

any(x in y for x in b for y in a) 

Es ist eine Schleife, aber man kann das nicht entgehen. Irgendeine Lösung wird zumindest eine implizite Schleife irgendwo haben.

+0

das funktioniert aber nur wahr oder falsch. Gibt es eine Möglichkeit zu spezifizieren, was das Spiel ist? –

+0

@ ozgur Antwort wird funktionieren. Ihre Frage Formulierung impliziert, dass Sie nur einen Boolean wollten. –

1

Sets ist eigentlich von geringen Nutzen, wenn Sie nicht für genaue Übereinstimmungen gesucht werden, wenn die Worte immer mit der gleichen Teilkette beginnen, Sortierung und Halbierungs wird also O(n log n) vs O(n^2) ein effizienter Ansatz: liefern

a = set(['this', 'is', 'an', 'apple!']) 
b = set(['apple', 'orange']) 

srt = sorted(a) 
from bisect import bisect 

inter = [word for word in b if srt[bisect(srt, word, hi=len(a))].startswith(word)] 
+0

was wäre das Problem, wenn die Ausgabe von 'inter' eine leere Liste ist ... –