Подтвердить что ты не робот

Как преобразовать список нескольких целых чисел в одно целое?

Как преобразовать список в Python 3.5, например:

x=[1, 3, 5]

к int из 135 (целое int)?

4b9b3361

Ответ 1

Если у вас есть список int, и вы хотите объединить их, вы можете использовать map с str, чтобы преобразовать их в строки, join их в пустую строку, а затем отбросить на int с помощью int.

В коде это выглядит так:

r = int("".join(map(str, x)))

и r теперь имеет желаемое значение 135.

Это, конечно, ограниченный подход, который приходит с некоторыми условиями. Он требует, чтобы указанный список содержал только положительный int (как ваш образец) или строки, представляющие int s, иначе шаги преобразования в строку могут завершиться неудачей или объединение (отрицательных) чисел будет неуклюжим.

Ответ 2

Вот более математический способ, который не должен преобразовывать назад и вперед в строку. Обратите внимание, что он будет работать, только если 0 <= я <= 9.

>>> x = [1, 3, 5]
>>> sum(d * 10**i for i, d in enumerate(x[::-1]))
135

Идея состоит в том, чтобы умножить каждый элемент в списке на соответствующую ему мощность 10 и затем суммировать результат.

Ответ 3

Используя только математику (нет преобразований в строки или из строк), вы можете использовать функцию reduce (functools.reduce в Python 3)

b = reduce(lambda total, d: 10*total + d, x, 0)

Это использует правило Хорнера, которое заставляет многочлен, представляющий число, уменьшать количество умножений. Например,

1357 = 1*10*10*10 + 3*10*10 + 5*10 + 7     # 6 multiplications
     = ((1*10 + 3)*10 + 5)*10 + 7          # 3 multiplications

В результате это быстрее, чем вычислительные мощности 10 или создание строки и преобразование результата в целое число.

>>> timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', 'from functools import reduce; x=[1,3,5,7]')
0.7217515400843695
>>> timeit.timeit('int("".join(map(str, [1,3,5,7])))')
1.425914661027491
>>> timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', 'x=[1,3,5,7]')
1.897974518011324

Справедливость: преобразование строк происходит быстрее, когда число цифр увеличивается.

>>> import timeit

# 30 digits
>>> setup='from functools import reduce; x=[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
6.520374411018565
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
6.797425839002244
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
19.430233853985555

# 60 digits
>>> setup='from functools import reduce; x=2*[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
13.648188541992567
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
12.864593736943789
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
44.141602706047706

# 120 digits!
>>> setup='from functools import reduce; x=4*[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
28.364255172084086
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
25.184791765059344
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
99.88558598596137

Ответ 4

Если вам не нравится карта, вы всегда можете использовать понимание списка:

s = [str(i) for i in x]
r = int("".join(s))