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)