Python: While e cicli for annidati
23 Aprile 2010
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): combinations = [] for item_a in iterable: for item_b in iterable: 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(1, 5)) print get_combinations(range(1, 5)) print get_combinations(range(1, 5)) print get_combinations(range(1, 5))
il funzionamento è corretto:
>>> [[3, 4], [2, 1]] [[1, 2], [3, 4]] [[4, 1], [3, 2]] [[1, 2], [3, 4]] >>>
ovviamente con itertools si fa molto prima:
from random import choice import itertools as it def get_combinations(iterable): combs = out = [choice(combs)] out += not in out [0] and c[1] not in out[0])] return out if __name__ == '__main__': print get_combinations(range(1, 5)) print get_combinations(range(1, 5)) print get_combinations(range(1, 5)) print get_combinations(range(1, 5))
infatti:
>>> [(1, 3), (2, 4)] [(1, 4), (2, 3)] [(1, 4), (2, 3)] [(1, 2), (3, 4)] >>>
Categorie:python
Commenti recenti