Python,递归减少列表(组合/排列)

我试图做一个通用的功能,将减少这样的列表:


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(lambda a,b:[a,b,str(a)+str(b)],['a','b','c'])


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

我认为我在某处缺少递归。


我不是特别要求代码,欢迎任何帮助或建议。谢谢。


三国纷争
浏览 187回答 2
2回答

郎朗坤

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']

慕侠2389804

这个怎么样?>>> 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']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python