簡體   English   中英

Python,遞歸地減少一個列表(組合/排列)

[英]Python, recursively reduce a list (combinations/permutations)

我試圖做一個通用函數,將減少這樣的列表:

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

我想我在某處缺少遞歸。

我不是特別要求代碼,歡迎任何幫助或建議。 謝謝。

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

這個怎么樣?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM