2012-02-24 26 views
13

En python2 podría utilizarconjunto de todos los subconjuntos

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

para encontrar todos los subconjuntos de mySet. Python 3 ha eliminado reduce.

¿Cuál sería una reescritura igualmente concisa de esto para Python3?

+5

'reduce()' todavía está allí - se movió a 'functools'. –

+1

@SvenMarnach: Ah, gracias. ¿Hay una versión que no sea 'reduce() '? – Randomblue

+6

No es exactamente una línea, pero los [documentos itertools] (http://docs.python.org/py3k/library/itertools.html) tienen una implementación powerset. – AdamKG

Respuesta

13

Aquí hay una list de varias implementaciones posibles del conjunto potencia (el conjunto de todos los subconjuntos) algoritmo en Python. Algunos son recursivos, algunos son iterativos, algunos de ellos no usan reduce. ¡Un montón de opciones para elegir!

5

La función reduce() siempre puede ser reemplazada por un bucle for. He aquí una implementación de Python de 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 

(. A diferencia de la versión incorporada de Python de reduce(), esta versión no permite pasar en None como start parámetro)

Especial-carcasa de este código con los parámetros que se pasan a reduce() da

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