Shashwat Anand wrote:
Shashwat Anand to Bangalore
show details 5:31 AM (2 minutes ago)
<snip>
I wrote an LCM function of mine as follows:
import fractions
def lcm(mylist):
# lcm by defination is Lowest Common Multiple
# lcm (a*b) = a*b / gcd(a*b)
# lcm (a, b, c) = lcm(lcm(a, b), c)
# the function lcm() returns lcm of numbers in a list
# for the special case of two numbers, pass the argument as lcm([a, b])
sol = 1
for i in mylist:
sol = sol * i / fractions.gcd(sol, i)
return sol
print lcm(range(1, 11)) #gives lcm of numbers (1, 2, 3....,9 ,10)
print lcm([2, 3]) #gives lcm of two numbers, a special case
print lcm([2, 5, 6, 10]) #gives lcm of a random list
However I also did a dirty hack as an alternate approach :
import fractions
l = [1]
print max( ( l[i-2], l.append(l[-1] * i / fractions.gcd(l[-1], i ) ) ) for i
in range(2, 12) )[0]
# prints the LCM of list (1, 10)
However to shorten the code i made it totally unpythonic.
Can reduce( ) or any other function be of help ?
Let me take a test-case as an example:
I want to multiple all the content of a given list,
now say my list is lst = [2, 3, 9]
I can do:
sol = 1
for i in lst:
sol *= i
print sol
However this can also be done as:
reduce( operator.mul, lst)
Can it be done via List Comprehension or we have to do dirty hacks as
mentioned above :(
Can the LCM function be reduced ?
*The point is if we insert a variable( sol here in both test case and LCM
case), which changes its values dynamically depending upon the next values
of the list, how can I calculate so without going through the long way of
using for-construct*, which makes me feel as though i'm coding in C. reduce(
) or even sum( ) does helps in some cases but it constrains me as per my
requirement. Any pointers ?
Starting where Alan left off,
def lcm(mylist):
def lcm2(a, b):
return a*b / fractions.gcd(a, b)
return reduce(lcm2, mylist)
or, if you feel the need to get rid of the extra name,
def lcm(mylist):
return reduce(lambda a,b : a*b/fractions.gcd(a,b), mylist)
DaveA
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor