字符串列表与排除项的组合

时间:2018-07-12 18:48:53

标签: python combinations itertools

我正在努力提出系统组件运行状态的详尽清单。每个组件都需要一个工作状态。我为组件#-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]

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

>>> 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()))