2012-04-11 13 views
1

Ich habe folgende Listen:Python Liste Kreuzung - Regex

I list1 und list2 vergleichen wollen und seit dem Vornamen Spiel TRUE zurück. Ich weiß, dass ich das mit gesetzten Schnittpunkten machen kann, wenn die vollständigen Namen in Liste2 verfügbar sind. Aber das ist nicht der Fall. Gibt es einen regulären Ausdruck passende Version von Satzschnitt

EDIT: Ja das Ergebnis für das obige Beispiel sollte eine echte sein, wenn ich eine list3

list3 = ['jack','jennifer'] 
list1-list2 : TRUE 
list2-list3 : FALSE 

EDIT2 haben: Ich glaube, ich nicht sehr klar war, in meiner ursprünglicher Beitrag. In list2 oder list3 konnte ich eine Kombination aus Vornamen haben und vollständigen Namen

list4 = ['john mayer', 'jennifer'] 
list1-list4 : TRUE 
+0

Ich habe am Ende meiner Antwort für Ihre List4 Fall hinzugefügt. –

+0

Kannst du bitte den folgenden englischen Satz vervollständigen: "Das Ergebnis sollte' True' sein, wenn und nur ________ –

+0

Das Ergebnis sollte True sein, wenn und nur wenn Mitglieder von List2 ein Regex Match mit Mitgliedern von sind list1, und False sonst – nitin

Antwort

1
def first_name_is_in(first_names, full_names): 
    for name in first_names: 
     for full_name in full_names: 
      if full_name.startswith("%s " % (name,)): 
       return True 
    return False 
+0

@nitin, das funktioniert nicht richtig, zum Beispiel: ''elizabeth taylor'.startwith (' eli ')' wird 'True' zurückgeben –

+0

ich habe meine Antwort bearbeitet, um ein Leerzeichen einzufügen – MattoTodd

+0

Jetzt ist es scheitert für 'elizabeth taylor'.startswith (' elizabeth taylor '). Deshalb erscheinen die anderen Antworten hier komplizierter. Sie behandeln beide Fälle korrekt –

0
full_names = ['john mayer', 'elizabeth taylor', 'steven barber','jennifer richards'] 
first_names = ['john','jennifer'] 

all((any(full.split()[0]==first for full in full_names) for first in first_names)) 
0

Als @gnibbler vorgeschlagen es am besten ist ein i gesetzt zu machen, so haben sich verändert Mine, dass zu verwenden.

>>> first_names = {name.split()[0] for name in list1} 
>>> all(x in first_names for x in list2) 
True 
1

Sie können einen Satz der Vornamen von list1 machen wie diese

>>> {x.split()[0] for x in list1} 
set(['john', 'jennifer', 'elizabeth', 'steven']) 

Sie verschiedene Set-Operationen wie diese

>>> list2 = ['john','jennifer'] 
>>> set(list2).difference(x.split()[0] for x in list1) 
set([])  # ie False 
>>> list3 = ['jack','jennifer'] 
>>> set(list3).difference(x.split()[0] for x in list1) 
set(['jack']) # ie True 

tun können, wenn Sie wirklich brauchen bools ...

>>> bool(set(list2).difference(x.split()[0] for x in list1)) 
False 
>>> bool(set(list3).difference(x.split()[0] for x in list1)) 
True 

oder die inverse ...

>>> bool(not set(list2).difference(x.split()[0] for x in list1)) 
True 
>>> bool(not set(list3).difference(x.split()[0] for x in list1)) 
False 

Für die neue list4 Testfall

>>> list4 = ['john mayer', 'jennifer'] 
>>> {x.split()[0] for x in list1}.union(list1) > set(list2) 
True 
>>> {x.split()[0] for x in list1}.union(list1) > set(list3) 
False 
>>> {x.split()[0] for x in list2}.union(list2) > set(list3) 
False 
>>> {x.split()[0] for x in list1}.union(list1) > set(list4) 
True 
1
>>> set(list2).issubset(ele.split(' ')[0] for ele in list1) 
True 

I entfernt [.], Wie ich in meinem ursprünglichen Beitrag, dank der Bemerkung von jamylak hatte.

+0

+1 Gute Lösung, aber warum nicht entfernen Sie die '[', ']' so dass Sie kein Listenverständnis erstellen? – jamylak

+0

Ja, [.] Ist hier nicht notwendig, also habe ich sie entfernt. Danke, dass du darauf hingewiesen hast. – Akavall