¿Cómo utilizar un rango para las teclas dict?

Tengo un progtwig que escanea Google en busca de enlaces, verifica cuántos enlaces has encontrado y luego trata de encontrar un éxito adecuado para tu búsqueda:

def check_urls_for_queries(self): """ The returned URLS will be run through a query regex to see if they have a query parameter. http://google.com <- False http://example.com/php?id=2 <- True """ filename = settings.create_random_filename() print("File being saved to: {}".format(filename)) with open("{}\\{}.txt".format(settings.DORK_SCAN_RESULTS_PATH, filename), "a+") as results: for url in self.connect_to_search_engine(): match = settings.QUERY_REGEX.match(url) # Match by regex for anything # that has a ?= in it if match: results.write(url + "\n") amount_of_urls = len(open(settings.DORK_SCAN_RESULTS_PATH + "\\" + filename + ".txt", 'r').readlines()) return("\nFound a total of {} usable links with query (GET) parameters, urls" " have been saved to {}\\{}.txt. This Dork has a success rate of {}%". format(amount_of_urls, settings.DORK_SCAN_RESULTS_PATH, filename, self.success_rate[amount_of_urls] if amount_of_urls in self.success_rate.keys() else 'Unknown success rate')) 

Lo que me gustaría hacer es crear la tasa de éxito usando un rango por clave de dictado:

 success_rate = { range(1, 10): 10, range(11, 20): 20, range(21, 30): 30, range(31, 40): 40, range(41, 50): 50, range(51, 60): 60, range(61, 70): 70, range(71, 80): 80, range(81, 90): 90, range(91, 100): 100 } 

Sin embargo, obviamente esto no funciona porque las listas no son objetos hashable:

 Traceback (most recent call last): File "tool.py", line 2, in  from lib.core import BANNER File "C:\Users\Documents\bin\python\pybelt\lib\core\__init__.py", line 1, in  from dork_check import DorkScanner File "C:\Users\Documents\bin\python\pybelt\lib\core\dork_check\__init__.py", line 1, in  from dorks import DorkScanner File "C:\Users\\Documents\bin\python\pybelt\lib\core\dork_check\dorks.py", line 6, in  class DorkScanner(object): File "C:\Users\Documents\bin\python\pybelt\lib\core\dork_check\dorks.py", line 11, in DorkScanner range(1, 10): 10, range(11, 20): 20, range(21, 30): 30, TypeError: unhashable type: 'list' 

¿Hay alguna manera de que pueda usar un rango para una clave de dictado para evitar tener que crear una clave de 1 a 100?

range() en Python 2 es simplemente una función que devuelve una lista de enteros, no es un tipo de objeto. Y no querría usar listas aquí, no, porque contienen todos los números enteros en el rango .

Podría usar objetos xrange() lugar, estos son hashable, y solo almacenan los valores de inicio y final. Sin embargo, a menos que planee usar otros objetos xrange() para probar estas claves, un diccionario con tales claves no es muy útil, tendría que recorrer el diccionario para probar su tasa contra cada objeto de xrange manual.

Su diccionario de tasa de éxito podría ser más simplemente reemplazado por matemáticas; simplemente redondee sus números hasta el múltiplo de 10 más cercano (simplemente use la división de piso):

 success_rate = ((amount_of_urls // 10) + 1) * 10 

Haga una prueba si el valor resultante está entre 10 y 100:

 10 <= success_rate <= 100 

La clase RangeKeyDict podría manejar casos como este, que es más general y fácil de usar. Para uso, verifique los códigos en __main__

para instalarlo utilizando:

 pip install range-key-dict 

Uso:

 from range_key_dict import RangeKeyDict if __name__ == '__main__': range_key_dict = RangeKeyDict({ (0, 100): 'A', (100, 200): 'B', (200, 300): 'C', }) # test normal case assert range_key_dict[70] == 'A' assert range_key_dict[170] == 'B' assert range_key_dict[270] == 'C' # test case when the number is float assert range_key_dict[70.5] == 'A' # test case not in the range, with default value assert range_key_dict.get(1000, 'D') == 'D' 

https://github.com/albertmenglongli/range-key-dict

Referencia: compruebe la respuesta en esta publicación: Rango como clave del diccionario en Python