【问题标题】:Combinations of a list of strings with exclusions字符串列表与排除项的组合
【发布时间】:2018-07-13 03:40:16
【问题描述】:

我正在努力为系统提供一份详尽的组件运行状态列表。我需要每个组件都有一个运行状态。我为每个操作状态开发了唯一的索引,格式为 component#-OS#,因此如果组件 1 具有三个操作状态,它们将是 1-1、1-2、1-3 等等。我想排除每个组件的重复操作状态,以便每个组件只存在一个。我正在使用 itertools 组合,但需要弄清楚如何以有效的方式合并排除项(我的问题比下面的示例问题要大得多):

 from itertools import combinations
 indices=["1-1", "1-2", "1-3", "2-1", "2-2", "3-1", "3-2", "4-1", "4-2", "4-3", "5-1", "5-2", "5-3"]
 out=list(combinations(indices, 5))

正如现在所写,out 包含许多重复的操作状态,并且比我想要的要长得多。事后我可以轻松地将它们过滤掉,但这将是一项非常耗时的工作。当我把这个问题带到全面的问题上时,会有数亿种组合,所以我需要找到一种方法来有效地限制输出,使每个组件只包含一个操作状态。这可能涉及以某种方式修改组合函数,但我不确定从哪里开始。

有什么想法吗?

编辑

为了澄清,我希望得到以下表格的输出:

[1-1, 2-1, 3-1, 4-1, 5-1], [1-2, 2-1, 3-1, 4-1, 5-1]...[ 1-3、2-2、3-2、4-3、5-3]

【问题讨论】:

  • 你的意思是list(itertools.product(["1-1", "1-2", "1-3"], ["2-1", "2-2"], ["3-1", "3-2"], ["4-1", "4-2", "4-3"], ["5-1", "5-2", "5-3"]))
  • 没有。该列表不是以这种方式组织的。我的数据框中的操作状态是分散的,而不是每个组件的时间顺序。我可以弄清楚如何以这种方式组织它们,如果它能让事情变得更容易的话..
  • 这很简单,我只是在问这是否是您想要的输出。我不太明白你的描述。
  • 我想要一个运行状态列表,每个组件都有一个唯一的操作系统。例如。 [1-1、2-1、3-1、4-1、5-1]、[1-1、2-1、3-1。 4-1, 5-2]等..
  • 对,这听起来像是product 的结果。你能确认一下吗?

标签: python combinations itertools


【解决方案1】:

您应该将每个组件的状态分成一个单独的列表,并使用itertools.product

from itertools import groupby, product
statelist = ["1-1", "1-2", "1-3", "2-1", "2-2", "3-1", "3-2", "4-1", "4-2", "4-3", "5-1", "5-2", "5-3"]
statelist = (list(b) for a, b in groupby(statelist, lambda x: x.partition('-')[0]))
out = list(product(*statelist))

【讨论】:

  • 谢谢。这似乎有效。我会在我的大型案例研究中尝试一下 :)
  • 我实际上发现一些操作状态被分成两个列表用于同一个组件?知道为什么会发生这种情况吗?
  • @Kingle 这假设它们在原始列表中分组在一起,例如如果你有['1-1', '2-1', '1-3'],你就会遇到问题。为此,请在前面添加一个 statelist.sort(key=lambda x: int(x.partition('-')[0])) 并在其上加上带有 groupby 的行——它会将相同组件的所有状态组合在一起
【解决方案2】:
>>> from collections import defaultdict
>>> from itertools import product
>>> indices=["1-1", "1-2", "1-3", "2-1", "2-2", "3-1", "3-2", "4-1", "4-2", "4-3", "5-1", "5-2", "5-3"]
>>> d=defaultdict(list)
>>> for e in indices:
...     d[e.split('-')[0]] += [e]
...
>>> out = list(product(*d.values()))

【讨论】:

  • 这也有效,但似乎比@MoxieBall 解决方案慢
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 2021-07-07
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多