create lowercase strings in lists - was: (No subject)

Mark Devine markdevine at eircom.net
Fri Dec 17 10:42:55 CET 2004


Thanks for the help. This is the final script:

#!/usr/bin/env python
import os
import sys
import time
import string
import pexpect
import commands


# 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)


the trouble is it throws up the following error for set:

$ ./test.py
Traceback (most recent call last):
  File "./test.py", line 23, in ?
    reflist = [normalize(element) for element in list1]
  File "./test.py", line 20, in normalize
    return set(text.split())
NameError: global name 'set' is not defined

when I checked http://docs.python.org/lib/genindex.html#letter-s

it said that
set() (built-in function) 

The python I use is the one that comes with cygwin. Does anybody know if the following version of python is incomplete or do I need to call built in functions in a different way?
 
$ python
Python 2.3.4 (#1, Jun 13 2004, 11:21:03)
[GCC 3.3.1 (cygming special)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.


Michael Spencer <mahs at telcopartners.com> 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





More information about the Python-list mailing list