es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de saltarse algunas combinaciones en itertools?

Hola chicos, tengo un archivo JSON con 1200 nombres de ciudades y sus poblaciones.

Estoy combinando esas ciudades de a 3 usando itertools.combination:

import json
from itertools import combinations as com

def main():
    data = json.load(open('new.json'))
    x = com(data, 3)
    triples_dict = [i for i in x]
main()

Este es solo un código de prueba, pero tarda demasiado en ejecutarse, sé que hay muchas combinaciones, y en realidad no necesito tantas; más adelante elegiré solo 10000 combinaciones basadas en alguna probabilidad lineal: cuanto mayor sea la suma de la población de 3 ciudades, menos probable será que esta combinación se incluya en esas 10000 combinaciones.

Estoy buscando una forma de optimizar la fase de combinación. Estaba pensando en saltar algunas combinaciones, por ejemplo, saltar cada cuarta combinación, pero no puedo encontrar una forma de hacerlo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de optimizar la fase de combinación es utilizar el método itertools.islice para omitir ciertas combinaciones. Este método te permite seleccionar un subconjunto de elementos de un iterador especificando un valor de inicio, parada y paso.

    Por ejemplo, para omitir cada 4ª combinación, puedes modificar el código de la siguiente manera:

    import json
    from itertools import combinations as com, islice
    
    def main():
        data = json.load(open('new.json'))
        x = com(data, 3)
        step = 4
        triples_dict = []
        for i in range(0, len(x), step):
            # omitir cada 4ª combinación
            sub_iter = islice(x, i, i+step)
            triples_dict.extend([j for j in sub_iter])
    
        print(triples_dict)
    
    main()
    

    En este código, utilizamos una variable step para indicar cuántas combinaciones omitir. Luego recorremos toda la lista de combinaciones x, utilizando range() para generar índices con un tamaño de paso de step. Para cada índice, creamos un nuevo iterador que omite las siguientes step combinaciones utilizando islice. Luego extendemos nuestra lista triples_dict con los resultados de cada subiterador.

    Este enfoque debería ayudar a acelerar la fase de combinación, aunque es posible que necesites experimentar con diferentes tamaños de paso para encontrar el equilibrio óptimo entre velocidad y precisión.

Comments are closed.