Home > python > Python: while e cicli for annidati

Python: while e cicli for annidati

Metodo alternativo al cosiddetto “cingolo” a scorrimento.
Da una lista genero tutte le combinazioni possibili, escluse le coppie con lo stesso elemento, doppio.
Da questa lista risultante, estraggo a sorte una coppia, ed una successiva, controllando che la seconda coppia,
non contenga elementi già presenti, nella prima.
Un po’ come negli accoppiamenti che si effettuano per stabilire un calendario sportivo.

Il codice è il seguente:

from random import choice


def get_combinations(iterable):
    input_list = [1, 2, 3, 4]
    combinations = []
    for item_a in input_list:
        for item_b in input_list:
            if item_a != item_b:
                combinations.append([item_a, item_b])

    output_list = []
    comb_1 = choice(combinations)
    output_list.append(comb_1)
    comb_2 = choice(combinations)

    flag = False
    while flag is False:
        flag = True
        for item_c in comb_2:
            for item_d in output_list:
                if item_c in item_d:
                    flag = False
                    comb_2 = choice(combinations)
                    break

    output_list.append(comb_2)
    return output_list


if __name__ == "__main__":
    print get_combinations(range(3))
    print get_combinations(range(3))
    print get_combinations(range(3))
    print get_combinations(range(3))
    print get_combinations(range(3))

il funzionamento è corretto:

>>> 
[[1, 4], [2, 3]]
[[1, 4], [2, 3]]
[[2, 4], [3, 1]]
[[3, 1], [4, 2]]
[[2, 3], [4, 1]]
>>> 

ovviamente con itertools si fa molto prima:

from random import choice
import itertools as it


def get_combinations(iterable):
    combs = [c for c in it.combinations(iterable, 2)]
    out = [choice(combs)]
    out += [c for c in combs if c not in out and
            (c[0] not in out [0] and c[1] not in out[0])]
    return out


if __name__ == '__main__':
    print get_combinations(range(4))
    print get_combinations(range(4))
    print get_combinations(range(4))
    print get_combinations(range(4))

Categorie:python
  1. aprile 23, 2010 alle 2:55 pm

    curioso

  1. aprile 23, 2010 alle 1:34 pm

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: