[Tutor] Splitting a number into even- and odd- numbered digits
Python
python at venix.com
Thu Apr 20 14:04:06 CEST 2006
On Wed, 2006-04-19 at 17:17 -0700, Carroll, Barry wrote:
> Greetings:
>
> I am writing a function that accepts a string of decimal digits,
> calculates a checksum and returns it as a single character string.
> The first step in the calculation is to split the input into two
> strings: the even- and odd- numbered digits, respectively. The least
> significant digit is defined as odd.
>
This sounds like credit card checksum processing. This is my code for
that:
def isbad(cardnumber):
factors = ([2,1] * 8)[-len(cardnumber):] # alternating factors of 2 and 1 ending with 1
chkprods = [int(d)*f for (d,f) in zip(cardnumber,factors)]
return sum(chkprods) % 10
This deviates quite a bit from your description and the description of
the algorithm that I was working from. It was only after I had coded up
separate even/odd character lists and looked at what was going on that I
realized there was a much simpler way to describe the rules.
Hopefully, I am not off in left field here.
> The following code fragment does the job but seems sort of brutish and inelegant to me:
>
> >>>>>>>
> >>> s = '987654321'
> >>> odd = ''
> >>> for c in s[::-2]:
> ... odd = c + odd
> ...
> >>> s = s[:-1]
> >>> even = ''
> >>> for c in s[::-2]:
> ... even = c + even
> ...
> >>> odd
> '97531'
> >>> even
> '8642'
> >>>>>>>
>
> Is there a better (i.e. more Pythonic) way to do this?
>
> Thanks in advance for all your help.
>
> Regards,
>
> Barry
> barry.carroll at psc.com
> 541-302-1107
> ________________________
> We who cut mere stones must always be envisioning cathedrals.
> -Quarry worker's creed
>
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
--
Lloyd Kvam
Venix Corp
More information about the Tutor
mailing list