2011-09-11 18 views

risposta

22

Sembra che si desidera itertools.combinations:

>>> list(itertools.combinations((1, 2, 3), 2)) 
[(1, 2), (1, 3), (2, 3)] 

Se si vuole set dovrete convertirli in modo esplicito.

>>> s = set((1, 2, 3)) 
>>> map(set, itertools.combinations(s, 2)) 
[set([1, 2]), set([1, 3]), set([2, 3])] 
+0

Dannazione !, tra l'altro la tua mappa può essere fatta con un elenco comp '[set (i) per i in itertools.combinations (s, 2))]' –

1

Questo è un sottoinsieme della power set di {1, 2, 3} (o qualunque set) contenente tutti i set di due elementi.

Vedere Python itertools documentation e cercare il termine "gruppo di accensione" per una risposta generale a questo problema.

1

solo per dare un'altra prospettiva, ho cercato un modo per scorrere tutte sottoinsieme del formato 2 di {1.....N}, così ho messo itertools.combinations in prova:

import itertools 
from time import time 


N = 7000 
lst = [i for i in xrange(N)] 

st = time() 
c1 = 0 
for x in itertools.combinations(lst, 2): 
    c1 += 1 
print "combinations: %f" % (time()-st) 

st = time() 
c2=0 
for x in xrange(N): 
    for y in xrange(x): 
     c2 += 1 
print "double loop: %f" % (time()-st) 
print "c1=%d,c2=%d" % (c1,c2) 

# prints: 
#combinations: 4.247000 
#double loop: 3.479000 
# c1=24496500,c2=24496500 

quindi credo che non dovrebbe girare sempre nella generale soluzione .... Se conosci in anticipo la dimensione del sottoinsieme che desideri, dovrebbe essere più efficiente per iterare usando i cicli.

Si noti inoltre che non si deve eseguire iterazione su list(itertools.combinations(lst, 2)) poiché questa mossa crea l'elenco (e molto più lento dell'utilizzo del generatore stesso).

+1

Questi due test non fanno lo stesso cosa. 'itertools.combinations' crea effettivamente una tupla; il tuo ciclo annidato non crea una tupla. – senderle

+1

Ho fatto un test rapido. Se hai effettivamente bisogno di creare tuple all'interno del ciclo annidato, è più lento del 50%. Inoltre, se non è necessario utilizzare un ciclo 'for' per elaborare l'output di' itertools.combinations', è possibile ottenere una notevole velocità con questa espressione del generatore: 'c3 = sum (1 per la coppia in itertools.combinations (1, 2)) '. Funziona circa il 40% più velocemente del ciclo nidificato più veloce. Ci sono sempre molte sottigliezze da considerare quando si ottimizza questo tipo di codice! – senderle

Problemi correlati