I am out of trial and error again Lists

Larry Hudson orgnut at yahoo.com
Thu Oct 23 09:10:28 CEST 2014


On 10/22/2014 03:30 PM, Seymore4Head wrote:
> On Wed, 22 Oct 2014 16:30:37 -0400, Seymore4Head
> <Seymore4Head at Hotmail.invalid> wrote:
>
> One more question.
> if y in str(range(10)
> Why doesn't that work.
> I commented it out and just did it "long hand"
>
> def nametonumber(name):
>      lst=[]
>      nx=[]
>      for x in (name):
>          lst.append(x)
>      for y in (lst):
>          #if y in str(range(10)):
>          if y in "1234567890":
>              nx.append(y)
>          if y in " -()":
>              nx.append(y)
>          if y in "abc":
>              nx.append("2")
>          if y in "def":
>              nx.append("3")
>          if y in "ghi":
>              nx.append("4")
>          if y in "jkl":
>              nx.append("5")
>          if y in "mno":
>              nx.append("6")
>          if y in "pqrs":
>              nx.append("7")
>          if y in "tuv":
>              nx.append("8")
>          if y in "wxyz":
>              nx.append("9")
>      number="".join(str(e) for e in nx)
>      return (number)
> a="1-800-getcharter"
> print (nametonumber(a))#1800 438 2427 837
> a="1-800-leo laporte"
> print (nametonumber(a))
> a="1 800 callaprogrammer"
> print (nametonumber(a))
>
I know you are trying to explore lists here, but I found myself somewhat intrigued with the 
problem itself, so I wrote a different version.  This version does not use lists but only 
strings.  I'm just presenting it as-is to let you try to follow the logic, but if you ask, I'll 
explain it in detail.  It turns your long sequence of if's essentially into a single line -- 
unfortunately 's' and 'z' have to be handled as special-cases, which turns that single line into 
a six-line if/elif/else set.  You might consider this line 'tricky', but I'll just say it's just 
looking at the problem from a different viewpoint.  BTW, this version accepts upper-case as well 
as lower-case.  isdigit() and isalpha() are standard string methods.

#------  Code  ----------
def name2number(name):
     nstr = ''    #  Phone-number string to return
     codes = 'abcdefghijklmnopqrtuvwxy'  #  Note missing s and z

     for ch in name:
         if ch in " -()":
             nstr += ch
         elif ch.isdigit():
             nstr += ch
         elif ch.isalpha():
             ch = ch.lower()
             #   S and Z are special cases
             if ch == 's':
                 nstr += '7'
             elif ch == 'z':
                 nstr += '9'
             else:
                 nstr += str(codes.index(ch) // 3 + 2)
     return nstr
#-------  End of Code  ---------

A possible variation would be to make nstr a list instead of a string, and use .append() instead 
of the +=, and finally return the string by using join() on the list.  Also, the if and first 
elif in the for could be combined:  if ch in " -()" or ch.isdigit():

      -=- Larry -=-




More information about the Python-list mailing list