2012-02-24 32 views
13

In python2 ho potuto usareinsieme di tutti i sottoinsiemi

def subsets(mySet): 
    return reduce(lambda z, x: z + [y + [x] for y in z], mySet, [[]]) 

per trovare tutti i sottoinsiemi di mySet. Python 3 ha rimosso reduce.

Quale sarebbe una riscrittura altrettanto concisa di questo per Python3?

+5

'reduce()' è ancora lì - è stato spostato in 'functools'. –

+1

@SvenMarnach: Ah, grazie. Esiste una versione non-'reduce() '? – Randomblue

+6

Non proprio un one-liner, ma i [itertools docs] (http://docs.python.org/py3k/library/itertools.html) hanno un'implementazione di powerset. – AdamKG

risposta

13

Ecco un list di diverse possibili implementazioni del set di alimentazione (l'insieme di tutti i sottoinsiemi) algoritmo in Python. Alcuni sono ricorsivi, alcuni sono iterativi, alcuni di loro non usano reduce. Un sacco di opzioni tra cui scegliere!

5

La funzione reduce() può essere sempre sostituita da un ciclo for. Ecco un'implementazione di Python di reduce():

def reduce(function, iterable, start=None): 
    iterator = iter(iterable) 
    if start is None: 
     start = next(iterator) 
    for x in iterator: 
     start = function(start, x) 
    return start 

(. In contrasto con la versione di Python built-in di reduce(), questa versione non permette di passare in None come start parametro)

Special-involucro questo codice con i parametri passati al reduce()

def subsets(my_set): 
    result = [[]] 
    for x in my_set: 
     result = result + [y + [x] for y in result] 
    return result 
Problemi correlati