Estoy leyendo una fuente de JavaScript y necesito convertirla a Python.
Aquí está el código, ya que solo soy un principiante, no obtengo la función .reduce() en absoluto
function bin2dec(num){ return num.split('').reverse().reduce(function(x, y, i){ return (y === '1') ? x + Math.pow(2, i) : x; }, 0); }Esto es lo que he intentado hasta ahora
def bin2dec(num): listNum = list(num) listNum = map(int, listNum) x = listNum[-1] listNum.reverse() for i in range (len(listNum)): if listNum[i] == 1: x = x + 2**listNum[i] else: x = x return xPero no es correcto.
Equivalencia normal
parseInt(x, 2)int(x, 2)Usando el mismo método que el código publicado
from functools import reduce import math def bin2dec(s): return reduce(lambda x, y_i: x + int(math.pow(2, y_i[0])) if y_i[1] == '1' else x, enumerate(reversed(s)), 0)Prueba
print(bin2dec('110')) # outut: 6Explicación
reversed(s) para reemplazar Javascript num.split('').reverse()reduce de Python de functools tiene la firma reduce(function, iterable[, initializer])function(x, y, i){... (1er argumento)y, iy_i son tuplas de valor, con y_i[0] = índice y y_i[1] el valorif else expresión en lugar de Javascript ? operador ternarioCódigo de Python más simple que usar Reducir
def bin2dec(s): return sum((0, 2**i)[y == '1'] for i, y in enumerate(s[::-1]))Simplemente puede usar la función int incorporada:
int("010010", 2) >>> 18Dicho esto, encontré un enfoque alternativo bastante interesante usando js2py . Puede alimentarlo con toda la función js como una cadena, lo que le permite usar js de manera efectiva dentro de python:
import js2py bin2dec = js2py.eval_js(""" function bin2dec(num){ return num.split('').reverse().reduce(function(x, y, i){ return (y === '1') ? x + Math.pow(2, i) : x; }, 0); } """) bin2dec("010010") >>> 18 Instalar con pip install js2py
Cometió muchos errores con su intento, la función de map devuelve un iterator , no una list . En general, solo evite el map y el filter y use una lista de comprensión en su lugar.
También elevaste 2 a la potencia del valor (1 o 0) cuando debería haber sido el índice.
Aquí hay una versión de trabajo de su ejemplo:
def bin2dec(num): listNum = [int(n) for n in num] total = 0 listNum.reverse() for i, n in enumerate(listNum): if n == 1: total += 2 ** i return total