If I use: if el.issubset(testelement): I get a closer anwser but the brackets cause a problem. They are optional in the test list so (D) in the test list is equal to D or (D) in the reference list.
"Mark Devine" <[EMAIL PROTECTED]> wrote: > > I got the script working. Thanks for all your help everyone. Trouble is its > not showing the correct results. Here is the script and results: > > #!/usr/bin/env python > import os > import sys > import time > import string > import pexpect > import commands > from sets import Set as set > > > # Test if the words of list2 elements appear in any order in list1 elements > # disregarding case and parens > > # Reference list > list1 = ["a b C (D)", "D A B", "A B E"] > # Test list > list2 = ["A B C D", "A B D", "A E F", "A (E) B", "A B", "E A B" ] > > def normalize(text, unwanted = "()", table = > string.maketrans(string.ascii_uppercase,string.ascii_lowercase)): > text.translate(table,unwanted) > return set(text.split()) > > reflist = [normalize(element) for element in list1] > print reflist > > #This is the list of sets to test against > > > def testmember(element): > """is element a member of the reflist, according to the above rules?""" > testelement = normalize(element) > #brute force comparison until match - depends on small reflist > for el in reflist: > if el.issuperset(testelement): > return True > return False > > for element in list2: > print element, testmember(element) > > Here is the results: > > $ ./test.py > [Set(['a', 'C', 'b', '(D)']), Set(['A', 'B', 'D']), Set(['A', 'B', 'E'])] > A B C D False > A B D True > A E F False > A (E) B False > A B True > E A B True > > The results should be: > > > A B C D True > > A B D True > > A E F False > > A (E) B True > > A B False > > E A B True > > > > > > Michael Spencer <[EMAIL PROTECTED]> wrote: > > > > > Steve Holden wrote: > > > Mark Devine wrote: > > > > > >> Actually what I want is element 'class-map match-all cmap1' from list > > >> 1 to match 'class-map cmap1 (match-all)' or 'class-map cmap1 mark > > >> match-all done' in list 2 but not to match 'class-map cmap1'. > > >> Each element in both lists have multiple words in them. If all the > > >> words of any element of the first list appear in any order within any > > >> element of the second list I want a match but if any of the words are > > >> missing then there is no match. There are far more elements in list 2 > > >> than in list 1. > > >> > > > > > sounds like a case for sets... > > > > >>> # NB Python 2.4 > > ... > > >>> # Test if the words of list2 elements appear in any order in list1 > > elements > > >>> # disregarding case and parens > > ... > > >>> # Reference list > > >>> list1 = ["a b C (D)", > > ... "D A B", > > ... "A B E"] > > >>> # Test list > > >>> list2 = ["A B C D", #True > > ... "A B D", #True > > ... "A E F", #False > > ... "A (E) B", #True > > ... "A B", #True > > ... "E A B" ] > > ... > > >>> def normalize(text, unwanted = "()"): > > ... conv = "".join(char.lower() for char in text if char not in > > unwanted) > > ... return set(conv.split()) > > ... > > >>> reflist = [normalize(element) for element in list1] > > >>> print reflist > > ... > > [set(['a', 'c', 'b', 'd']), set(['a', 'b', 'd']), set(['a', 'b', 'e'])] > > > > This is the list of sets to test against > > > > > > >>> def testmember(element): > > ... """is element a member of the reflist, according to the above > > rules?""" > > ... testelement = normalize(element) > > ... #brute force comparison until match - depends on small reflist > > ... for el in reflist: > > ... if el.issuperset(testelement): > > ... return True > > ... return False > > ... > > >>> for element in list2: > > ... print element, testmember(element) > > ... > > A B C D True > > A B D True > > A E F False > > A (E) B True > > A B True > > E A B True > > >>> > > > > Michael > > > > -- > > http://mail.python.org/mailman/listinfo/python-list > > > > > > _________________________________________________________________ > Sign up for eircom broadband now and get a free two month trial.* > Phone 1850 73 00 73 or visit http://home.eircom.net/broadbandoffer > > > -- > http://mail.python.org/mailman/listinfo/python-list > _________________________________________________________________ Sign up for eircom broadband now and get a free two month trial.* Phone 1850 73 00 73 or visit http://home.eircom.net/broadbandoffer -- http://mail.python.org/mailman/listinfo/python-list