diccionario - Diccionarios de Python: forma diferente de iterar a través de un dict

CorePress2024-01-24  7

Estoy buscando una forma diferente de acceder a cada clave de un diccionario dentro de un bucle for. Debajo, hay un código de ejemplo, donde itero a través de un diccionario y accedo a cada clave con la ayuda de un contador y una declaración if. ¿Existe otra forma de acceder a las claves, sin un contador o una declaración if?

def string_to_dict(csv):
    dict = []
    tmp = csv.splitlines()
    
    for i in tmp:
        tmp_dict = {"vorname" : "none", "nachname" : "none", "email" : "none"};
        tmp_i= i.split(",")
        counter = 0;

        for si in tmp_i:
            if counter ==0:
                tmp_dict["vorname"] = si
                counter =counter + 1
            elif counter == 1:
                tmp_dict["nachname"] = si
                counter = counter + 1
            else:
                tmp_dict["email"] = si
        dict.append(tmp_dict)
csv = """Donald,Duck,[email protected]
    Wiley,Coyote,[email protected]
    Road,Runner,[email protected]"""

Quizás csv.DictReader pueda resultarle útil

-Ralf

27/03/2021 a las 10:42

Además, usar dict como nombre de variable no es bueno porque anula el dict integrado

-Ralf

27/03/2021 a las 10:43

Como ya se sugirió, si está manipulando un archivo CSV, utilice el módulo csv de la biblioteca estándar. Es más fácil que intentar realizar todo el análisis usted mismo y soluciona adecuadamente todos los posibles problemas relacionados con las citas, etc.

- Thierry Lathuille

27 de marzo de 2021a las 10:47



------------------------------------

No es necesario el bucle si ya esperas el nombre, apellido y correo electrónico.

def string_to_dict(csv):
    dict = []
    tmp = csv.splitlines()
    
    for i in tmp:
        tmp_dict = {"vorname" : "none", "nachname" : "none", "email" : "none"};
        tmp_i= i.split(",")

        tmp_dict["vorname"] = tmp_i[0]
        tmp_dict["nachname"] = tmp_i[1]
        tmp_dict["email"] = tmp_i[2]

        dict.append(tmp_dict)

Podemos seguir iterando para mejorar la solución:

def string_to_dict(csv):
    dict = []
    tmp = csv.splitlines()
    
    for i in tmp:
        tmp_dict = {"vorname" : None, "nachname" : None, "email" : None};
        tmp_i= i.split(",")

        tmp_dict["vorname"] = tmp_i[0]
        tmp_dict["nachname"] = tmp_i[1]
        tmp_dict["email"] = tmp_i[2]

        dict.append(tmp_dict)

Y aún más (si desea utilizar una palabra clave protegida como dict, la convención de nomenclatura es utilizar un guión bajo después):

def string_to_dict(csv):
    dict_ = []
    for line in csv.splitlines():
        vor_name, nach_name, email = line.split(",")
        dict_.append({"vorname" : vor_name, "nachname" : nach_name, "email" : email})
    return dict_

Y con listas por comprensión:

def string_to_dict(csv):
    def _parse_item(vor_name, nach_name, email):
        return {"vorname" : vor_name, "nachname" : nach_name, "email" : email}
    return [_parse_item(*line.split(",")) for line in csv.splitlines()]

8

Hola, gracias por la ayuda. Estaba tratando de hacerlo también con comprensión, bPero no sé cómo expresarlo en una sola línea. En lo que estoy trabajando ahora es en lo siguiente, pero no funciona. ¿Me puede ayudar? split_dict = [x.split(",") para x en tmp] append_dict = {tmp[x.index] = ("vorname": x[0]) para x, y en split_dict}

- Luis Michael Luethi

27/03/2021 a las 20:56

¡Se puede hacer usando una función auxiliar! ver la respuesta actualizada

-miquelvir

27/03/2021 a las 21:08

1

Vaya, eso es genial. Aún no lo he conseguido funcionar, pero entendí lo que has escrito

- Luis Michael Luethi

27/03/2021 a las 21:19

Para que la comprensión funcione, pasé todos los índices a la función: return([_parse_item(line.split(",")[0],line.split(",")[1] , line.split(",")[2]) para la línea en csv.splitlines()])

- Luis Michael Luethi

27/03/2021 a las 21:33

Esa no es una buena idea, ya que calculas la división 3 veces. ¡He actualizado mi error tipográfico!

-miquelvir

27/03/2021 a las 21:39



------------------------------------

Si desea cambios mínimos en lo que ha hecho hasta ahora, puede obtener una lista de claves y usar el valor del índice (variable de contador en su caso), algo como esto:

for i in tmp:
    tmp_dict = {"vorname" : "none", "nachname" : "none", "email" : "none"};
    tmp_i= i.split(",")
    counter = 0;
    keys = [*temp_dict.keys()]    # List of Keys
    for si in tmp_i:
        tmp_dict[keys[counter]] = si  # Key at index counter
        counter += 1
    dict.append(tmp_dict)

Ejecución de muestra:

>>string_to_dict(csv)
[{'vorname': '    Road', 'nachname': 'Runner', 'email': '[email protected]'}, {'vorname': '    Road', 'nachname': 'Runner', 'email': '[email protected]'}, {'vorname': '    Road', 'nachname': 'Runner', 'email': '[email protected]'}]

Otra nota: Eres naMezclar la variable como dict. Deberías evitarlo ya que es una palabra clave en Python



------------------------------------

Comencemos con el hecho de que no está intentando iterar sobre un diccionario sino crear una lista que contenga entradas de diccionario a partir de una cadena en formato CSV. En segundo lugar, hay muchos errores sintácticos de Python en su código. Abstenerse de utilizar palabras reservadas como "dict" como nombres de parámetros.

Puedes usar este fragmento de código como comienzo si te ayuda, pero te recomiendo repasar la sintaxis y las mejores prácticas de Python.

result = []
for line in csv.splitlines():
    vorname, nachname, email = line.split(",")
    result.append(
        {"vorname": vorname.strip(), "nachname": nachname.strip(), "email": email.strip()})

Esto también se puede hacer usando la lista completa.encendido, pero es mucho menos legible

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare