我正在尝试创建一个通用函数来减少列表,如下所示:
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']
我真的不知道怎么做.我做了几次尝试,但都没有成功.
我很确定有一种方法可以用reduce来实现,但我对使用这个函数不太满意.以下是一些尝试:
reduce(lambda a,b:[a,b,str(a)+str(b)],['a','b','c'])
reduce(str.join,['a','b','c'])
我想我错过了某个地方的递归.
我不是特别要求代码,欢迎任何帮助或建议.谢谢.
解决方法:
itertools.combinations将为您提供一定长度的所有组合.我们为每个可能的子列表长度采用所有组合.然后,我们将您感兴趣的函数(lambda函数,或在本例中为“x”.join)映射到每个生成的组合.
>>> 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']]
现在l是我们想要展平的列表列表:
>>> [ x for y in l for x in y]
['a', 'b', 'c', 'axb', 'axc', 'bxc', 'axbxc']
标签:python,lambda,reduce,fold,list