Python, reduce recursivamente una lista (combinaciones / permutaciones)

Estoy tratando de hacer una función genérica que reduciría una lista como esta:

func(['a','b','c'],str.join) # --> ['a','b','c','ab','ac','bc','abc'] func(['a','b','c'],lambda: a,b:a+'x'+b) # --> ['a','b','c','axb','axc','bxc','axbxc'] 

Realmente no sé cómo hacerlo. Hice algunos bashs, pero ninguno tuvo éxito. Estoy bastante seguro de que hay una forma de hacerlo con reducción, pero no estoy muy cómodo con el uso de esta función. Aquí hay algunos bashs:

 reduce(lambda a,b:[a,b,str(a)+str(b)],['a','b','c']) reduce(str.join,['a','b','c']) 

Creo que me estoy perdiendo una recursión en algún lugar.

No estoy pidiendo un código especialmente, cualquier ayuda o consejo es bienvenido. Gracias.

itertools.combinations te dará todas las combinaciones de cierta longitud. Tomamos todas las combinaciones para cada posible longitud de sublista. Luego mapeamos la función en la que estaba interesado (la función lambda, o en este caso, "x".join ) a cada una de las combinaciones generadas.

 >>> import itertools as it >>> a = ['a','b','c'] >>> l = [map("x".join, list(it.combinations(a, l))) for l in range(1,len(a)+1)] >>> l [['a', 'b', 'c'], ['axb', 'axc', 'bxc'], ['axbxc']] 

Ahora l es una lista de listas que queremos aplanar:

 >>> [ x for y in l for x in y] ['a', 'b', 'c', 'axb', 'axc', 'bxc', 'axbxc'] 

¿Cómo es esto?

 >>> import itertools >>> def func(mylist, letter): ... L = [] ... for i in range(len(mylist)): ... L.append(list(itertools.combinations(mylist,i+1))) ... return [letter.join(i) for i in itertools.chain.from_iterable(L)] ... >>> func(['a','b','c'], 'x') ['a', 'b', 'c', 'axb', 'axc', 'bxc', 'axbxc']