用python进行组合

用python进行组合,python,algorithm,sorting,combinations,combinatorics,Python,Algorithm,Sorting,Combinations,Combinatorics,我有四个价值观 age = 23 gender = "M" city ="Delhi" religion = "Muslim" 我需要用空值按每个组合排列,如- 23 * * * 23 M * * 23 M Delhi * 23 M Delhi Muslim * M * * * M Delhi * * M Delhi Muslim * * Delhi * * * Delhi Muslim * * * Muslim * * * * 我需要在一个列表中按维度数升序排列。因此,具有一个值的组合应该

我有四个价值观

age = 23
gender = "M"
city ="Delhi"
religion = "Muslim"
我需要用空值按每个组合排列,如-

23 * * *
23 M * *
23 M Delhi *
23 M Delhi Muslim
* M * *
* M Delhi *
* M Delhi Muslim
* * Delhi *
* * Delhi Muslim
* * * Muslim
* * * *
我需要在一个列表中按维度数升序排列。因此,具有一个值的组合应该位于顶部。我有30多个属性,所以我需要一种在Python中自动完成这项工作的方法


有什么想法吗?

看,它有一个方法来

看,它有一个方法来

下面呢:

In [21]: attrib = (23, "M", "Delhi", "Muslim")

In [25]: comb = list(itertools.product(*((a, None) for a in attrib)))

In [26]: comb
Out[26]: 
[(23, 'M', 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', None),
 (23, 'M', None, 'Muslim'),
 (23, 'M', None, None),
 (23, None, 'Delhi', 'Muslim'),
 (23, None, 'Delhi', None),
 (23, None, None, 'Muslim'),
 (23, None, None, None),
 (None, 'M', 'Delhi', 'Muslim'),
 (None, 'M', 'Delhi', None),
 (None, 'M', None, 'Muslim'),
 (None, 'M', None, None),
 (None, None, 'Delhi', 'Muslim'),
 (None, None, 'Delhi', None),
 (None, None, None, 'Muslim'),
 (None, None, None, None)]
现在,如果我正确理解了您的排序要求,那么以下内容应该可以做到:

In [27]: sorted(comb, key=lambda x:sum(v is not None for v in x))
Out[27]: 
[(None, None, None, None),
 (23, None, None, None),
 (None, 'M', None, None),
 (None, None, 'Delhi', None),
 (None, None, None, 'Muslim'),
 (23, 'M', None, None),
 (23, None, 'Delhi', None),
 (23, None, None, 'Muslim'),
 (None, 'M', 'Delhi', None),
 (None, 'M', None, 'Muslim'),
 (None, None, 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', None),
 (23, 'M', None, 'Muslim'),
 (23, None, 'Delhi', 'Muslim'),
 (None, 'M', 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', 'Muslim')]
在您使用
*
的地方,我使用了
None
,但使用后者并不重要


当然,对于30个属性,您将看到大约10亿个组合,因此使用后续排序将列表展平可能不起作用。但是,对于10亿个条目,您还能做些什么呢?

以下内容如何:

In [21]: attrib = (23, "M", "Delhi", "Muslim")

In [25]: comb = list(itertools.product(*((a, None) for a in attrib)))

In [26]: comb
Out[26]: 
[(23, 'M', 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', None),
 (23, 'M', None, 'Muslim'),
 (23, 'M', None, None),
 (23, None, 'Delhi', 'Muslim'),
 (23, None, 'Delhi', None),
 (23, None, None, 'Muslim'),
 (23, None, None, None),
 (None, 'M', 'Delhi', 'Muslim'),
 (None, 'M', 'Delhi', None),
 (None, 'M', None, 'Muslim'),
 (None, 'M', None, None),
 (None, None, 'Delhi', 'Muslim'),
 (None, None, 'Delhi', None),
 (None, None, None, 'Muslim'),
 (None, None, None, None)]
现在,如果我正确理解了您的排序要求,那么以下内容应该可以做到:

In [27]: sorted(comb, key=lambda x:sum(v is not None for v in x))
Out[27]: 
[(None, None, None, None),
 (23, None, None, None),
 (None, 'M', None, None),
 (None, None, 'Delhi', None),
 (None, None, None, 'Muslim'),
 (23, 'M', None, None),
 (23, None, 'Delhi', None),
 (23, None, None, 'Muslim'),
 (None, 'M', 'Delhi', None),
 (None, 'M', None, 'Muslim'),
 (None, None, 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', None),
 (23, 'M', None, 'Muslim'),
 (23, None, 'Delhi', 'Muslim'),
 (None, 'M', 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', 'Muslim')]
在您使用
*
的地方,我使用了
None
,但使用后者并不重要

当然,对于30个属性,您将看到大约10亿个组合,因此使用后续排序将列表展平可能不起作用。然而,对于10亿个条目,你还能做些什么呢?

通过在内存中构建完整的子集列表,然后对其进行排序,解决了这个问题。这需要O(2n)空间和O(n2 2n)时间。如果这是不可接受的,那么这里有一种在O(n)空间和O(n2n)时间中生成子集的方法

通过在内存中构造子集的完整列表,然后对其进行排序来解决此问题。这需要O(2n)空间和O(n2 2n)时间。如果这是不可接受的,那么这里有一种在O(n)空间和O(n2n)时间中生成子集的方法


itertools.product
是最好的,但对于位推特来说:
[s if n&2**i else note for i,s in enumerate(attrib)]对于n in range(len(attrib)**2)]
itertools.product是最好的,但是对于位推特来说:
[s if n&2**i else note for i,s in enumerate(attrib)]对于n in range(len(attrib)**2
(+1)我本来打算按照同样的思路编写一些代码,但你帮我省去了麻烦。:)(+1)我本来打算用同样的思路编写一些东西,但你帮我省去了麻烦。:)