4

次のようにリストを削減する汎用関数を作成しようとしています:

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

どこかで再帰が欠けていると思います。

特にコードを求めているわけではありません。助けやアドバイスは大歓迎です。ありがとう。

4

2 に答える 2

3

どうですか?

>>> 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']
于 2013-06-17T08:36:35.443 に答える
3

itertools.combinations特定の長さのすべての組み合わせが得られます。可能なサブリストの長さごとにすべての組み合わせを使用します。次に、関心のある関数 (ラムダ関数、この場合"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']
于 2013-06-17T08:35:25.203 に答える