【问题标题】:Python, recursively reduce a list (combinations/permutations)Python,递归减少列表(组合/排列)
【发布时间】:2013-06-13 03:49:05
【问题描述】:

我正在尝试创建一个通用函数来减少这样的列表:

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

我想我在某处遗漏了递归。

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

【问题讨论】:

  • 我不认为你在这里减少一个列表,而是你输出各种排列。
  • 你不太舒服意味着它不起作用,或者它对你来说根本不好看?
  • 这意味着,我知道它是如何工作的,我更喜欢在可能的情况下使用这些功能,但我仍然很难使用它。
  • 您正在寻找 powersets,请参阅 itertools 页面上的配方:docs.python.org/2/library/itertools.html

标签: python list lambda reduce fold


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    怎么样?

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

    【讨论】:

    • @ibi0tux 不客气 :)。我现在实际上正在编辑我的答案以使其成为一个功能:3
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 2016-06-19
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多