【问题标题】:Powerset recursive, list comprehension python3Powerset递归,列表理解python3
【发布时间】:2016-02-06 22:32:02
【问题描述】:

我是 Python3 的新手,正在尝试做一个递归的 powerset 函数。它应该使用列表理解。

我写道:

def powerset(seq):
    if not seq:
       return [[]]
    return powerset(seq[1:]) + [[seq[0]] + n for n in powerset(seq[1:])]

此函数有效,但我收到反馈并被告知没有必要调用该函数两次。它做了很多计算。它应该能够轻松计算多达 20 个 powerset。那我该怎么办?如果不调用该函数两次,我将无法使其工作。谢谢。

【问题讨论】:

  • 你知道如何将函数的返回值保存到变量中,然后使用该变量吗?
  • 你的意思是 res += res + [[seq[0] + n for n in powerset(seq[1:])] 其中 res 是一个空列表?还是我完全错了?
  • 完全错误,很遗憾。你知道subset = powerset(seq[1:]) 是什么意思吗?
  • 将其存储在变量中?您在下面写的列表理解中的子集是什么意思?
  • 这是一个元组文字。如果您不熟悉元组,那么无论您学习 Python 所经历的一切,都有望很快涵盖它们。 Python tutorial 可能有助于更详细地解释基础知识,而不是适用于 Stack Overflow cmets。

标签: python python-3.x recursion powerset


【解决方案1】:

只需计算一次powerset(seq[1:]),将其存储在变量中,然后使用两次:

def powerset(seq):
    if not seq:
        return [[]]
    ps = powerset(seq[1:])
    return ps + [[seq[0]] + n for n in ps]

与您的不同之处在于,您使用 ps 两次,但您只计算一次。


或者,您可以使用双重列表理解(如果您喜欢那种东西...)

def powerset(seq):
    return [x for ps in powerset(seq[1:]) for x in ([seq[0]] + ps, ps)] if seq else [[]]

这里,相同的临时变量ps 被定义在列表推导式中。但请注意,这种方式的结果顺序会略有不同。


我感觉很不清楚。我实际上不明白如何将它分配给变量可以改变它?意思一样吗?

您在这里似乎对纯数学的思考太多了。在编程中,y = f(x) 并不是说​​“y 与 f(x) 相同/同义”,而是“将 f(x) 的结果赋给 y”。

【讨论】:

  • 双嵌套列表推导几乎总是可以简化为单列表推导。在这种情况下,它将是[x for subset in powerset(seq[1:]) for x in (subset, [seq[0]] + subset)]
  • 但是将它存储在一个变量中和仅仅写出来有什么区别呢?它做同样的事情对吗?而且我对双嵌套列表理解不太熟悉。 “+ps, ps”是什么意思(不是 powerset(seq[1:]))?调用这个函数是不是太过分了?
  • @user2357112 是的,我在想这样的事情,但不知何故搞砸了。现已修复。
  • @blik3o:您似乎不清楚导致函数被调用的原因。如果分配ps = powerset(seq[1:]),使用ps 不会导致再次调用powerset
  • 感觉很不清楚。我实际上不明白如何将它分配给变量可以改变它?意思一样吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 2020-10-17
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多