1

este es el enunciado: Dados dos vectores A y B, de N elementos cada uno, se desean calcular: a. el vector suma. b. el producto escalar.

y este es mi programa:

'''

    def definir_vectores ():
    texto_vector_a = input("escriba el vector a sin parentesis y separado x espacios:\n")
    lista_vector_a = texto_vector_a.split()
    texto_vecto_b = input("escriba el vector b sin parentesis y separado x espacios:\n")
    lista_vector_b = texto_vecto_b.split()

    return lista_vector_a,lista_vector_b

def suma (a,b):
    vector_suma = []
    for i in range(len(a)):
        vector_suma[i].append(a[i] + b[i]) #aca me tira error

    return vector_suma

def producto_escalar (a,b):
    sumatoria = 0
    for i in range(len(a)):
        sumatoria += a[i]*b[i]
    return sumatoria


def main():
    a,b = definir_vectores()
    vector_suma = suma(a,b)
    print ("el vector suma es\n:", vector_suma)
    sumatoria = producto_escalar (a,b)
    print("el producto escalar es\n", sumatoria)


main()

'''

Ahi senale donde me tira error, En ese lugar lo que quise hacer es colocar en el subindice i del vector suma, la sumatoria de los vectores a y b indice por indice

Cristobal
  • 69
  • 4

3 Answers3

2

Tu codigo tiene dos fallos:

1: cuando usas append() simplemente agregas un elemento a la lista, no tienes que indicar la posicion como en otros idiomas , funciona como el tipico "add()"

2: para poder operar una suma por ejemplo , no puedes sumar dos letras por lo cual tienes que castearlas a Integer para poder operar.

Te dejo el codigo corregido, aplica esta resolucion para arreglar producto_escalar(a,b) ;)

def definir_vectores ():
    texto_vector_a = input("escriba el vector a sin parentesis y separado x espacios:\n")
    lista_vector_a = texto_vector_a.split()
    texto_vecto_b = input("escriba el vector b sin parentesis y separado x espacios:\n")
    lista_vector_b = texto_vecto_b.split()


    return lista_vector_a,lista_vector_b

def suma (a,b):
    
    vector_suma = []

    for i in range(len(a)):
       vector_suma.append(int(a[i]) + int(b[i])) 

    return vector_suma

def producto_escalar (a,b):
    sumatoria = 0
    for i in range(len(a)):
        sumatoria += a[i]*b[i]
    return sumatoria


def main():
    a,b = definir_vectores()
    vector_suma = suma(a,b)
    print ("el vector suma es\n:", vector_suma)
    sumatoria = producto_escalar (a,b)
    print("el producto escalar es\n", sumatoria)


main()
Shockz
  • 289
  • 1
  • 12
1

Veo que estás liando demasiado el problema. Te voy a poner un ejemplo más "Pythonico" de como se haría, ya que utilizas un estilo de programación, más usado en otros lenguajes como por ejemplo C. El código que yo te propongo es el siguiente:

def definir_vectores ():
    texto_vector_a = input("escriba el vector a sin parentesis y separado x espacios:\n")
    lista_vector_a = list(map(float, texto_vector_a.split()))
    texto_vector_b = input("escriba el vector b sin parentesis y separado x espacios:\n")
    lista_vector_b = list(map(float, texto_vector_b.split()))

    return lista_vector_a,lista_vector_b

def vect_sum(v1,v2):
    if len(v1) != len(v2):
        raise ValueError("La longitud de los vectores para multiplicarlos debe ser igual")
    return [x+y for x,y in zip(v1,v2)]

def scalar_product(v1, v2):
    if len(v1) != len(v2):
        raise ValueError("La longitud de los vectores para multiplicarlos debe ser igual")
    return sum([x*y for x,y in zip(v1,v2)])

if __name__ == "__main__":
    a, b = definir_vectores()
    print("el vector suma es:\n", vect_sum(a))
    print("el producto escalar es:\n", scalar_product(a, b))

Paso a explicarte funciones que puedes tener dudas:

  • list(map(float, texto_vector_a.split())): el map funciona cualquier operación map en otro lenguaje, es decir, es un for que va iterando sobre cada elemento de la lista de texto_vector. Lo único que no retorna una lista, si no un objeto, por lo que tendremos que convertirlo a lista. Con esta operación convertimos los inputs a floats

  • sum(v): esta es una función built-in de Python, es decir creada por Python para su uso (al igual que map, list, etc), que suma todos los elementos de una lista.

Ahora vamos al producto escalar:

  1. if len(v1) != len(v2): Lo primero que hacemos es comprobar que el tamaño de los vectores es iguales, ya que si no es igual, no podremos realizar el producto escalar, en ese caso, lanzamos un error propio con raise ValueError("El número de dimensiones para multiplicar vectores debe ser igual")

  2. sum([x*y for x,y in zip(v1,v2)]): aquí aplicamos lo que se conoce como list comprehension es algo muy utilizado en python, es la forma de escribir un bucle for en una sola linea. zip() es otra función built-in que agrupa dos listas por indice, es decir, el valor primer valor de v1 va con el primer valor de v2, el segundo valor de v1, va con el segundo valor de v2, así hasta los N valores que haya en las listas. Una vez los tenemos agrupados, los desagrupamos para poder multiplicarlos. Es decir, con zip() hemos agrupado cada par de valores, y ahora iteramos por el valor primero y el valor segundo y los multiplicamos que sería [x*y for x,y in zip(v1,v2)]. Por último y para finalizar tendremos una lista de productos escalares multiplicados, por lo que solo nos falta sumar todos los elementos de la lista con sum().

¿ Y qué es __name__ == "__main__":?

Para que te sea sencillo de entender y no extender demasiado la respuesta, resumiento bastante, tiene la misma función que int main(){} en C

Aquí tienes una explicación maravillosa de está función, por si quieres profundizar ¿Qué es if __name__ == “__main__”:?

Rubiales Alberto
  • 7,416
  • 7
  • 16
  • 40
1

Una de las características importantes de Python es su manejo de listas, que simplifica enormemente la vida es situaciones como esta.

Veamos algunos ejemplos:

Convertir input a lista numérica

Estas dos líneas ingresan un vector de caracteres;

texto_vector_a = input("escriba el vector a sin parentesis y separado x espacios:\n")
lista_vector_a = texto_vector_a.split()

El resultado es

lista_vector_a = ["1","2", "3"]

lo que necesitamos es un vector de valores numéricos. Para eso recorremos el arregla haciendo la conversión usando comprensión de listas:

texto_vector_a = input("escriba el vector a sin parentesis y separado x espacios:\n")
lista_vector_a = [float(x) for x in texto_vector_a.split()]

El resultado sera:

lista_vector_a = [1, 2, 3]

Operaciones en paralelo

Tanto la suma como el producto escalar requieren recorrer ambos vectores en paralelo, operando sobre un valor de cada par.

Python tiene la función zip, que toma dos o mas iterable y devuelve una lista de tuplas con los valores pareados.

Ejemplo:

vector1 = [1, 2, 3]
vector2 = [4, 5, 6]
for x in zip(vector1, vector2):
    print(x)

produce

(1, 4)
(2, 5)
(3, 6)

Esto simplifica los métodos suma y producto escalar. Con un zip logramos que Python nos vaya entregando los elementos de ambos vectores pareados:

def suma (a,b):
    return [x[0] + x[1] for x in zip(a, b)]

def producto_escalar (a,b):
    return sum(x[0] * x[1] for x in zip(a, b))

Espero que te sea útil.

Candid Moe
  • 21,247
  • 9
  • 18
  • 40