Se podría generar todas las subcadenas de antemano, y asignarlos a sus respectivas llaves.
#generates all substrings of s.
def genSubstrings(s):
#yield all substrings that contain the first character of the string
for i in range(1, len(s)+1):
yield s[:i]
#yield all substrings that don't contain the first character
if len(s) > 1:
for j in genSubstrings(s[1:]):
yield j
keys = ["New York", "Port Authority of New York", "New York City"]
substrings = {}
for key in keys:
for substring in genSubstrings(key):
if substring not in substrings:
substrings[substring] = []
substrings[substring].append(key)
A continuación, puede consultar substrings
para obtener las claves que contienen esa subcadena:
>>>substrings["New York"]
['New York', 'Port Authority of New York', 'New York City']
>>> substrings["of New York"]
['Port Authority of New York']
Pros:
- conseguir llaves por subcadena es tan rápido como el acceso a un diccionario.
Contras:
- Generación
substrings
incurre en un costo de una sola vez al comienzo de su programa, teniendo un tiempo proporcional al número de llaves en programs
.
substrings
crecerá aproximadamente de forma lineal con el número de teclas en programs
, aumentando el uso de la memoria de su secuencia de comandos.
genSubstrings
tiene un rendimiento O (n^2) en relación con el tamaño de su clave. Por ejemplo, "Autoridad Portuaria de Nueva York" genera 351 subcadenas.
Exactamente. Simplemente no esperes que sea rápido si tu diccionario es grande. –
@MarkRansom Estaba a punto de añadir que mi diccionario es bastante grande y que se espera que crezca. Ha estado haciendo 'programs.get ('new york')' hasta ahora, que ha sido muy rápido. –
Si recorrer todas las teclas del diccionario es demasiado lento para su aplicación, debe crear una estructura de datos orientada a este tipo de consulta. Eso probablemente sería algún tipo de índice invertido basado en palabras o un árbol de sufijos. – mensi