2015-11-19 3 views
2

Предположим, у нас есть список номеров, и мы хотим умножить на него все числа, пока продукт является цифрой.Умножаемые цифры в списке

Для примера:

[2,2,5] => [4,5] 

[3,3,7] => [9,7] 

[5,5,5,5,5] => [5,5,5,5,5] 

Могу ли я каким-то образом использовать functools.reduce здесь? Что такое pythonic способ решить эту проблему?

+0

вы можете объяснить, как вы получаете те выходы – The6thSense

+0

что, если есть ноль? – farhawa

+0

Первые два в порядке, но [5,5,5,5,5] => [5,5,5,5,5] как? –

ответ

5

Это может быть легко решена с помощью простого отслеживанием состояния алгоритма:

def multiply_digits(lst): 
    res = [] 
    for x in lst: 
     if res and res[-1] * x < 10: 
      res[-1] *= x 
     else: 
      res.append(x) 
    return res 

Хотя существует эквивалентный функциональный способ (с reduce), что не будет быть таким же простым, поскольку вам нужно либо собрать список результатов на каждом шаге, либо переносить текущее значение числа отдельно.

+0

Что делать, если у меня будет вход [3, 2, 2, 2, 2, 2, 2, 2, 2, 2] и ожидаем получить [3,8,8,8], а не [4,6,8 , 8] (поэтому после присоединения я получил бы наименьшее возможное число, 3888 <4688)? – Adiqq

+1

@Adiqq Это намного сложнее и не подходит для этого вопроса. Вы можете попытаться перейти со спины (используя ['reverseed'] (https://docs.python.org/3/library/functions.html#reversed) в Python), но вам, вероятно, нужен умный алгоритм (или просто перебор всех возможностей), чтобы найти число, которое дает наименьший результат. – phihag

1

Это может сделать трюк:

def process(lst): 
    lst = sorted(lst) 
    last = 1 
    result = [] 
    for el in lst: 
     if last * el >= 10: 
      result.append(last) 
      last = el 
      continue 
     last *= el 
    result.append(last) 
    return result 
+1

Зачем сортировать список? – Netwave

+0

@ DanielSanchez Я предполагаю, что порядок чисел не имеет значения, т. Е. Мы просто не уменьшим возможные комбинации. В случае ответа фигага порядок имеет значение, например. '[21, 2, 2, 1]' и '[2, 21, 2, 1]'. – freakish

1

Это лучше, я думаю:

from numpy import product 
reduce(lambda x , y : (x[0:-1]+[y*x[-1]] if product(x+[y])<10 else x+[y]) if len(x)>0 else [y] ,[21,1,2,3,4,5,6],[]) 
+0

Этот код проверяет только n-1 цифры. Он возвращает неверные результаты для почти всех входов. Например, я ожидаю '[9, 2, 2] => [9, 4]', '[8]' => '[8]', '[2, 2, 3, 3] => [ 4,9]. – phihag

+0

Теперь проверьте его снова. Это работает. –

+0

Нет, он все еще терпит неудачу в самом первом испытании, которое я дал ('[9, 2, 2] => [9, 4]'). Кроме того, обновленная версия ужасно неэффективна, поскольку она постоянно создает списки и вызывает «numpy.product» для одного умножения. – phihag

Смежные вопросы