【发布时间】:2020-04-12 12:43:17
【问题描述】:
社区!
我正在尝试解决这个任务:
输入:我有一个单词列表。 输出:我需要返回每个符合条件的排列列表:
- 所有排列在输入列表中都有一个邻居
- 列表元素的顺序不能改变
例子:
In: ['cat', 'sat', 'on']
Out: [('cat', 'sat', 'on'), ('cat', 'sat'), ('sat', 'on'), ('cat'), ('sat'), ('on')]
解释示例:不允许排列 ('cat','on'),因为 'cat' 和 'on' 在输入列表中不是邻居。不允许排列 ('cat','on','sat'),因为 inout 列表中的 'on' 在 'sat' 时更正确,但在这种排列中,单词的顺序没有被保存。
我试过写这个函数并清除它的结果:
def findsubsets(S,m):
return set(itertools.combinations(S, m))
但我认为,然后我们生成所有可能的组合(在大多数操作系统情况下,我有很多单词的列表),我们使用了大量的内存,所以我试图找到解决方案,这不会' t 生成组合,然后我将选择我需要的排列。我正在寻找明确的解决方案,无需额外的转换。
我正在写 Python 3,我正在寻找内存最少的这些任务的解决方案。我在这个网站上搜索过类似的问题,但没有找到。
提前感谢您解决此问题。
【问题讨论】:
-
到目前为止你有什么尝试?
-
我试过写这个函数并在之后清除它的结果:
def findsubsets(S,m): return set(itertools.combinations(S, m))但我认为,然后我们生成所有可能的组合,我们使用了大量的内存,所以我试图找到解决方案,这不会产生组合,之后我会选择我需要的排列。我正在寻找明确的解决方案,无需额外的转换。 -
你应该更新你的问题
-
添加有问题的信息
-
itertools.combinations 是惰性的,这意味着它仅在必要时生成(进行一次迭代时)。而
set(...)本质上与{x for x in itertools.combinations(S, m)}相同,这使得set-approach 实际上并没有使用更多的ram,只是内部循环的cpu-time 更多。不需要的组合只存在一个循环周期。但是 oldwookis 解决方案通过使用巧妙的第二个循环完全满足您的需求来避免这些额外的循环
标签: python permutation