Tengo un diccionario de nombres de calles y sus valores, como tú. Las claves son cadenas, los valores son ints. Quiero escribir un pequeño fragmento de código que me permita imprimir todos los nombres de calles que terminen con "gatan" usando una expresión regular.

dictionary = {Storgatan: 46, Talgvägen: 51, Malmstigen: 8, Huvudgatan: 3...}

import re 

ends_with= 'gatan$'
test_dictionary= dictionary 

m1 = re.match(ends_with,test_dictionary)
if m1 is not None:
    print(m1)

Sin embargo, esto devuelve el error "cadena esperada u objeto similar a bytes".

¿Cómo resuelvo esto fácilmente? Gracias

-1
user8580031 8 oct. 2019 a las 09:57

3 respuestas

La mejor respuesta

Si debe usar expresiones regulares, puede usar re.match mientras itera sobre el diccionario.

import re

dictionary = {'Storgatan': 46, 'Talgvägen': 51, 'Malmstigen': 8, 'Huvudgatan': 3}

regex = '.*gatan$'

results = [v for k, v in dictionary.items() if re.match(regex, k)]

print(results)

Salida:

[46, 3]

N.B: Esto será lento para diccionarios grandes

Si solo quieres los nombres clave:

matching_keys = [k for k in dictionary if re.match(regex, k)]
2
rdas 8 oct. 2019 a las 07:27

Simplemente, podemos usar key.endswith('gatan') así:

for key, val in dictionary.items():
    if isinstance(key, str) and not key.endswith('gatan'):
        # key not ending with `gatan`
       print(key, val)

Si desea crear otro diccionario, entonces podemos hacerlo en una línea como esta:

filtered_dictionary = {key: val for key, val in dictionary.items() if not key.endswith('gatan')}
1
Dipen Dadhaniya 8 oct. 2019 a las 07:12

Eche un vistazo a la documentación de la biblioteca de expresiones regulares . Busque la definición de función match. Verá que la función espera una estructura de datos string, no una dict.

0
joseph 8 oct. 2019 a las 07:04
58281481