[risolto][Python] Itertools creare una combinazione con una sola coppia

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 857
Iscrizione: domenica 7 luglio 2013, 15:55
Desktop: GNU/Linux
Distribuzione: Ubuntu 22.04.2 LTS
Sesso: Maschile

[risolto][Python] Itertools creare una combinazione con una sola coppia

Messaggio da TommyB1992 »

Ipotizzando di avere una lista come:
[1,2,3,4,5]

vorrei ottenere tutte le combinazioni con 3 elementi con 2 uguali o 3 differenti, cioè:
1,1,2
1,1,3
1,2,3
...
2,2,3
2,3,4
...
5,5,1
5,4,3

ma NON:
5,5,5

Attualmente l'unica idea che mi è venuta è fare:

Codice: Seleziona tutto

from itertools import product
list(map(list, product([1,2,3,4,5], repeat=3)))
E poi togliere i valori che hanno 3 elementi uguali.
Ultima modifica di TommyB1992 il martedì 7 marzo 2023, 11:01, modificato 1 volta in totale.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: [Python] Itertools creare una combinazione con una sola coppia

Messaggio da rai »

Ciao,
io userei piuttosto https://docs.python.org/3/library/itert ... eplacement

Codice: Seleziona tutto

>>> import itertools as it
>>> [x for x in it.combinations_with_replacement(range(1,6),3) if len(set(x)) > 1]
[(1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 1, 5), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 3), (1, 3, 4), (1, 3, 5), (1, 4, 4), (1, 4, 5), (1, 5, 5), (2, 2, 3), (2, 2, 4), (2, 2, 5), (2, 3, 3), (2, 3, 4), (2, 3, 5), (2, 4, 4), (2, 4, 5), (2, 5, 5), (3, 3, 4), (3, 3, 5), (3, 4, 4), (3, 4, 5), (3, 5, 5), (4, 4, 5), (4, 5, 5)]
>>> 
Ma magari product() è più efficiente? bisognerebbe fare qualche test

EDIT
Effettivamente in questo caso pare meglio usare combinations_with_replacement()

Codice: Seleziona tutto

$ python3 -m timeit -s "from itertools import combinations_with_replacement as f" "i = range(9)" "l = [x for x in f(i, 3)  if len(set(x)) > 1]"
5000 loops, best of 5: 38.9 usec per loop

$ python3 -m timeit -s "from itertools import product as f" "i = range(9)" "l = [x for x in f(i, repeat=3)  if len(set(x)) > 1]"
2000 loops, best of 5: 168 usec per loop
 
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 857
Iscrizione: domenica 7 luglio 2013, 15:55
Desktop: GNU/Linux
Distribuzione: Ubuntu 22.04.2 LTS
Sesso: Maschile

Re: [Python] Itertools creare una combinazione con una sola coppia

Messaggio da TommyB1992 »

Scusa se ti rispondo solo ora perchè ieri ho cominciato a scrivere ma poi ho preso la febbre e fra una cosa e l'altra non ho più risposto.

E' perfetto, mi serviva principalmente per dare una pulita al codice perchè c'erano veramente troppe righe inutili.
Grazie mille
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: [risolto][Python] Itertools creare una combinazione con una sola coppia

Messaggio da rai »

Bene :ciao:
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 12 ospiti