Saltar al contenido

Acceder a los valores de dictado de Python con los caracteres de inicio clave

Solución:

No puedes hacer eso directamente con dict, debe recorrer el dict y hacer coincidir cada clave con la palabra clave y devolver el valor correspondiente si se encuentra la palabra clave. Este va a ser un O(N) operación.

>>> my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}
>>> next(v for k,v in my_dict.items() if 'Date' in k)
'15th july'

Para obtener todos esos valores, use una lista de comprensión:

>>> [ v for k,v in my_dict.items() if 'Date' in k]
['15th july']

usar str.startswith si desea solo aquellos valores cuyas claves comiencen con ‘Fecha’:

>>> next( v for k,v in my_dict.items() if k.startswith('Date'))
'15th july'
>>> [ v for k,v in my_dict.items() if k.startswith('Date')]
['15th july']

no es la mejor solución, se puede mejorar (anular obtiene el objeto)

class mydict(dict):
    def __getitem__(self, value):
        keys = [k for k in self.keys() if value in k]
        key = keys[0] if keys else None
        return self.get(key)


my_dict = mydict({'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'})
print(my_dict['Date'])# returns 15th july

Seguro que es posible:

print next(val for key, val in my_dict.iteritems() if key.startswith('Date'))

pero esto implica una exploración completa del diccionario. Solo encuentra el primero tal clave coincidente (donde ‘primero’ es arbitrario) y aumenta StopIteration en lugar de KeyError si ninguna clave coincide.

Para acercarse a lo que está pensando, es mejor escribir esto como una función:

def value_by_key_prefix(d, partial):
    matches = [val for key, val in d.iteritems() if key.startswith(partial)]
    if not matches:
        raise KeyError(partial)
    if len(matches) > 1:
        raise ValueError('{} matches more than one key'.format(partial))
    return matches[0]
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *