[Python] Hilo general

Rivendel

#1649 como te dice #1650 haz un random choice de cada lista, concatena y luego saca de caracteres

1
CiudadanoEj

#1649 como lo tienes hecho ahora hay una probabilidad bastante mas alta de que te salgan letras a numeros o simbolos porque estas escogiendo entre todo.
Podrias hacer como ha dicho #1650 o podrias hacer como bitwarden y preguntar cuantos simbolos, numeros y longitud quiere la persona y entonces hacer 3 bucles para cada uno con esas longituded y haces un shuffle.

1 respuesta
Rezagado

#1652 Sí, de hecho en el ejercicio original se pregunta cuantos números, letras y símbolos quiere el usuario, pero he querido hacer una variación para practicar un poco más por mi cuenta.

Rezagado

Bueno ya casi lo tengo, he puesto un random.choice para todas las variables pero ahora si escribo que quiero un password de 8 caracteres me genera una contraseña con 8 números 8 letras y 8 símbolos lol

Lo fácil es preguntar con un input la cantidad de cada variable que quiere el usuario, pero no quería hacerlo fácil xd

1 respuesta
telemaco103

#1654 Elige de manera aleatoria el número de letras, números y caracteres, algo así:

Long_Pass = 8

Cant_Let = np.random.randint(0, Long_Pass-2)
Cant_Num = np.random.randint(Cant_Let, Long_Pass-1)
Cant_Carac = Long_Pass - Cant_Let - Cant_Num

Otra forma si tienes generadas las tres contraseñas de 8 dígitos cada una es generar un vector de enteros de la misma longitud y de valores entre 0 y 2. Si en esa posición hay un 0, en la contraseña final en esa posición habrá una letra, si en esa posición hay un 1 habrá un número y si hay un 2 habrá un caracter. Por ejemplo el vector [0 1 0 2 1 2 1 0] sería como decir que en la pass final la forma es [Letra Número Letra Caracter Número Caracter Número Letra]. Con esto te aseguras de que la distribución de números, letras y caracteres es "equiprobable". Te dejo un código muy sencillito de entender para un nivel bajo-medio:

Pass_Let = "abcdefgh"
Pass_Num = "01234567"
Pass_Caract = "£$%^&@[]"

Vector = np.random.randint(0,3,size=8)

Pass = []

for i in range(Long_Pass):
    if Vector [i] == 0:
        Pass.append(Pass_Let[i])
    elif Vector [i] == 1:
        Pass.append(Pass_Num[i])
    elif Vector [i] == 2:
        Pass.append(Pass_Caract[i])
2
11 días después
CaNaRy_r00lz

Buenas gente tengo una duda muy sencilla seguramente pero no entiendo pk no funciona.
Resulta que tengo una lista [1,2,3] y quiero odernarla al reves, es decir [3,2,1,] he buscado online y veo que se puede usar .reverse() o .reversed() bien mi problema es que .reverse() me devuelve none

a=[1,2,3]
print(a.reverse())

He visto que se puede hacer con slicing [::-1] pero no entiendo pk en los ejemplos que veo online funciona con reverse y yo no consigo hacerlo funcionar

2 respuestas
Krules

#1656 no estoy delante del pc ahora mismo pero diría que .reverse() es un metodo que modifica la propia lista cambiando a.

Creo que tienes que hacerse a.reverse() y luego print a

En cambio con reversed() que es una funcion que devuelve los valores en distinto order pero no modifica la propia lista a no ser que la reasignes con a = reversed(a)

Algo así me suena que era

2 respuestas
Rivendel

#1656 https://www.w3schools.com/python/ref_list_reverse.asp

#1657 reversed devuelve un iterator, reverse una lista que es iterable, no se muy bien la diferencia xd

2 respuestas
CaNaRy_r00lz

#1657 Si es lo que comentas, a.reverse() y luego print a, pensaba que se podia hacer el print seguido, gracias!

#1658 Tambien se buscar en google

1 respuesta
Krules

#1658 reverse no devuelve nada, updatea la lista y ya, de ahi que no le funcione con el print

1 1 respuesta
Rivendel

#1660 si de hecho lo probe en el editor y devuelve None por lo que dices, no puedes hacer el print a una instruccion, tienes que hacerlo a la lista

#1659 te lo puse porque el ejemplo del Try it yourself es como dice Krules, pensaba que te seria util

1
B

Si no se especifica un "return" cpython siempre va a devolver "none". Ya sea invocando una función, o al ejecutar "scripts"....

Puedes ver el bytecode que se genera con "dis":

import dis

def mytest():
    print("Test!")

def mytestB():
    print("Test!")
    return 1234

dis.dis(mytest)
dis.dis(mytestB)
dis.dis("tt=123")

Ten en cuenta que las listas son de tipo mutable... así que, al menos que no te interese hacerlo... clonarla/crear una nueva no tiene sentido. Podrías decir... ¿y porque no simplemente devuelve la referencia a la lista? Supongo para forzar que no hagas "mylist = mylist.reverse()" y ahorrarse instrucciones.

1
1mP

Tengo una duda: Si quiero copiar una lista de un lugar de internet, para crear una lista con ella... Cómo lo hago si cada elemento está separado por un enter? Me refiero:

NSFW

Existe una forma de que este formato me lo pase a una lista?

3 respuestas
Kaiserlau

#1663 guarda en un file, la lees por linea y vas rellenado la lista. También puedes usar BS y ni tirar de file.

1 1 respuesta
Rivendel

#1663 https://www.w3schools.com/python/ref_file_readlines.asp quiza esto te sirva

1 1 respuesta
1mP

#1664 #1665 muuuchisimas gracias a ambos.

1
CaNaRy_r00lz

Una pregunta, aqui me gustaria que parase cuando llega a 50, pero como esta se para cuando llega a 47.593, lo puedo "arreglar" que en vez de poner >50 sea >51
Si pongo >= 50 sigue haciendo lo mismo, se puede mejorar lo que tengo? anteriormente lo habia hecho con un for loop pero luego pensando vi que con un while se podia hacer lo mismo y me quitaba los If´s.

Se trata de calcular el 6% empezando en el 100% de cada mes, pero se va calculando por mes, es decir el mes 1 es 100 el 2 es 94 el tercero es el 6& del mes 2 , etc y debe parar en 50 no menos

potency = 100
month = 0

while potency >= 50:
    percent = (float(potency) * 0.06)
    potency = round(float(potency) - float(percent),3)
    month +=1
    print(f"Month {month}")
    print(f"Potency {potency}%")



1 respuesta
B

#1667 El principal problema es que estás comprobando "potency" demasiado tarde... una solución sería que la comprobación del bucle solo tenga en cuenta valores en caso de que se vaya la cosa de madre... y hacer un "break" dentro del bucle cuando la condición de que potency<50.
Por ejemplo... ya que son 12 meses ... y para no marear con si month empieza en 0 pero no...

potency = 100.0
month = 1

while month <= 12:
    percent = potency * 0.06
    potency = round(potency - percent, 3)
    if potency < 50:
        break
    print(f"Month {month}")
    print(f"Potency {potency}%")
    month += 1

** Ya que "potency" siempre va a tender a ser menor que 50 ... si no quieres "limitarlo" a 12 meses... podrías hace un bucle "infinito" (while True:), sabiendo que la condición de "potency<50" lo va a terminar parando si o si.

1 respuesta
CaNaRy_r00lz

#1668 Entiendo, gracias, cuando lo hice con el for loop, tenia el break igual que has puesto tu, pero quise intentar hacerlo mas compacto el codigo.

9 días después
KARMA

Tengo una duda con sqlite3 , he creado una tabla y si intento obtener solo un dato de ella por la columna id , funciona perfecto , pero si lo intento por la columna nombre o apellido me dice "no such column" , no encuentro la solucion , que podria ser?

import sqlite3
from alumnos import Alumnos

clase = []

alumno1 = Alumnos(1, "Carlos", "Perez")
clase.append((alumno1.id, alumno1.nombre, alumno1.apellido))
alumno2 = Alumnos(2, "Luis", "Vazquez")
clase.append((alumno2.id, alumno2.nombre, alumno2.apellido))
alumno3 = Alumnos(3, "Juanjo", "Ballesta")
clase.append((alumno3.id, alumno3.nombre, alumno3.apellido))
alumno4 = Alumnos(4, "Ricardo", "Bayo")
clase.append((alumno4.id, alumno4.nombre, alumno4.apellido))
alumno5 = Alumnos(5, "Javi", "Yllana")
clase.append((alumno5.id, alumno5.nombre, alumno5.apellido))
alumno6 = Alumnos(6, "Roberto", "Pelaez")
clase.append((alumno6.id, alumno6.nombre, alumno6.apellido))
alumno7 = Alumnos(7, "Maria", "Fandiño")
clase.append((alumno7.id, alumno7.nombre, alumno7.apellido))
alumno8 = Alumnos(8, "Mati", "Argentino")
clase.append((alumno8.id, alumno8.nombre, alumno8.apellido))

conn = sqlite3.connect("Alumnos.db", isolation_level=None)
cursor = conn.cursor()

cursor.execute("""CREATE TABLE if not exists Alumnos (
    ID INT PRIMARY KEY,
    nombre TEXT,
    apellido TEXT)""")

cursor.executemany("INSERT or replace into Alumnos VALUES(?,?,?)", clase)


alumno = cursor.execute("SELECT * FROM Alumnos WHERE nombre=Roberto")
print(alumno.fetchone())

cursor.close()
conn.close()

Salida : alumno = cursor.execute("SELECT * FROM Alumnos WHERE nombre=Roberto")
sqlite3.OperationalError: no such column: Roberto

EDIT: Vale , me auto respondo , al ponerlo asi , si me funciona: alumno = cursor.execute("SELECT * FROM Alumnos WHERE nombre=?", ("Roberto",)) ,aun asi sigo sin entender porque con id si funcionaba y con el resto no, si alguien lo pudiera explicar xD

1 respuesta
Naith

#1670 no sería nombre='Roberto' ? Con las comillas.

1 1 respuesta
KARMA

#1671 :man_facepalming: , pues tienes razon , tambien habia que poner las comillas ahi , como era un string supuse que era algo que detectaba automatico , tiene sentido entonces que con la id que es un numero si funcionara xD , menudo fail , muchas gracias ahora ya lo entiendo

1
EkaITz

Buenas, tengo una duda, estoy usando Pycharm para un proyecto con Python. En el equipo tengo instalado SQLite3 perfectamente, pero en Pycharm no me reconoce el archivo. ¿Debo instalar algún plugins en concreto en Pycharm?

Grax!

1 respuesta
gonya707

#1673 por lo que se python incluye herramientas para manejo de sqlite por defecto, no hay que instalar nada de nada, no tiene que ver con pycharm.

A no ser que te refieras a ver la base de datos desde pycharm como una tabla de datos, en ese caso si mal no recuerdo es una feature de la version de pago de pycharm, asi que no creo que dejen que haya ningun plugin con eso

1 1 respuesta
EkaITz

#1674 Seguramente sea lo segundo que dices, porque a la persona que estoy viendo se le abre desde Pycharm.

Muchas gracias por responder!

maccgeo

#1663 Guardas en un archivo y luego usas split que devuelve una lista, así:

lista = cadena.split("\n")
13 días después
hda

Hey muchachos, tengo un par de millones de archivos json en s3 que me gustaría cargar en python. ¿Alguna recomendación para hacer esto eficiente?

¡Gracias!

1 respuesta
Naith

#1677 ¿Que entiendes por cargar? ¿Dejarlos en memoria de forma permanente? ¿Subirlos procesarlos y guardar el resultado en otro sitio? ¿De cuantos GBs de datos estamo hablando?

1 1 respuesta
hda

Gracias por responder, #1678. En local debo hacer una clasificación sobre el texto de un campo de cada uno de los json, que son pequeños (de media < 10 kb). Así que mi idea es cargar todos los archivos json en local, estimo que serán unos 15 Gb de ram, y luego correr el clasificador.

1 respuesta
Naith

#1679 tienes varias opciones. Las tres más directas serían: traer los ficheros a local e ir procesándolos ahí, crear una instancia EC2, configurarla y procesarlos (no le veo mucho sentido a esta opción), o usar AWS Lambda con una imagen Docker en la que tengas el clasificador. ¿Que es mejor? Depende del flujo de datos y lo que quieras hacer en un futuro. Si te interesa automatizarlo y que en un futuro los archivos que se vaya subiendo hagan esa clasificación de forma automática tiraría por Lambda aunque para esta primera ejecución inicial tendrías que hacerlo por bloques y no en una sola ejecución, pues hay límite de RAM sobre 10GB y 15 minutos de ejecución, y además, es más recomendable usar Lambda con menos memoria pues el precio se dispara mucho, no es lo más óptimo en cuanto a rendimiento/$ y el ‘fine-tuning’ de la memoria es algo que varía de caso a caso (aunque para el volumen de datos que estas manejando no va a ser muy grande la diferencia). El lado 'negativo' es que tienes que ver como juntar luego esos archivos que contienen los resultados de las clasificaciones, aunque es algo prácticamente trivial. Y como recomendación procesar cosas en ARM sale más barato que con x86 en AWS.

También existirán otras 15 formas de hacerlo porque AWS es inmenso, pero lo más directo debería ser eso.

Si quieres hacerlo todo con python vas a tener que usar boto3 (el SDK de AWS para python). https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

1 1 respuesta

Usuarios habituales