为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2021-03-31 08:15:30
我试图做一个通用的功能,将减少这样的列表: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'])我认为我在某处缺少递归。我不是特别要求代码,欢迎任何帮助或建议。谢谢。
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-04-02
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

这个怎么样?


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


查看完整回答
反对 回复 2021-04-02
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号