У меня есть код, который вычисляет наименьшее общее кратное для списка чисел. Я хотел бы изменить этот код, чтобы он возвращал список значений, представляющих наименьшее общее кратное для каждой пары в моем списке номеров.

def lcm(numbers):
    return reduce(__lcm, numbers)

def __lcm(a, b):
    return ( a * b ) / __gcd(a, b)

def __gcd(a, b):
    a = int(a)
    b = int(b)
    while b:
        a,b = b,a%b
    return a

Если на входе [3, 5, 10], на выходе будет [lcm(5,10)=10, lcm(3,5)=15, lcm(3,10)=30] (сортировка не требуется).

Я чувствую, что есть какой-то элегантный способ вычисления этого списка наименьших общих кратных, но я не могу понять его без какого-либо примера.

1
Eric Schoonover 10 Сен 2010 в 05:17

2 ответа

Лучший ответ

То, что у вас есть, выглядит хорошо. Я бы только изменил способ получения ответа:

def lcm(numbers):
    return map(__lcm, combinations( numbers, 2 ) )

Где я использую комбинации из itertools.

4
wheaties 10 Сен 2010 в 01:37

Учитывая ваши существующие функции (с __gcd (), отредактированным так, чтобы возвращать a, а не ничего):

from itertools import combinations

inlist = [3, 5, 10]

print [lcm(pair) for pair in combinations(inlist, 2)]
3
kindall 10 Сен 2010 в 01:32