在一个较大的列表中,确定其元素构成确切元素的列表分类

2024-10-02 20:38:41 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 3。你知道吗

序言

所以我有一个元素列表,可以这样排序(或任何其他方式):

List = [c, d, a, c, b] 

为了让事情变得更简单:

List = [a, b, c, c, d]

所以列表可能有重复项,长度在1到10之间。你知道吗

用户将选择一个范围号,例如:

r = 3

范围号是逻辑的一部分,该逻辑产生的列表数包含长度为1到r的“列表”子序列的所有可能组合。每个组合可以以任何方式排列。考虑到本例中的'List'和'r',用户将得到以下列表选择:

%Lists of length 1.  
ListSelection1 = [[a], [b], [c], [c], [d]]

%Lists of length 2.
ListSelection2 = [[a, b], [a, c], [a, c], [a, d], [b, c], [b, c], [b, d], [c, c], [c, d], [c, d]]

%Lists of length 3.
ListSelection3 = [[a, b, c], [a, b, c], [a, b, d], [a, c, c], [a, c, d], [a, c, d], [b, c, c], [b, c, d], [b, c, d], [c, c, d]]

这些列表将排列在另一个列表中,如下所示:

ListSelections = [ListSelection1, ListSelection2, ListSelection3]

问题

如何识别“ListSelections”中包含与“List”相同的元素选择的(子)列表的所有可能组合?元素的顺序无关紧要。关于上述示例,可接受的列表组合将是[b,c]和[a,c,d],或[b]+[c]+[d]+[a,c]。你明白了。你知道吗

我需要确定所有正确的列表组合以及这些列表在“ListSelections”中的位置。你知道吗


Tags: of用户元素列表排序方式逻辑length
2条回答

我想你想找到的是multiset的分区集。为此,可以使用sympy如下所示:

from sympy.utilities.iterables import multiset_partitions
res=[p for p in multiset_partitions(["a","b","c","c","d"])]

输出:

[[['a', 'b', 'c', 'c', 'd']],
 [['a', 'b', 'c', 'c'], ['d']],
 [['a', 'b', 'c', 'd'], ['c']],
 [['a', 'b', 'c'], ['c', 'd']],
 [['a', 'b', 'c'], ['c'], ['d']],
 [['a', 'b', 'd'], ['c', 'c']],
 [['a', 'b', 'd'], ['c'], ['c']],
 [['a', 'b'], ['c', 'c', 'd']],
 [['a', 'b'], ['c', 'c'], ['d']],
 [['a', 'b'], ['c', 'd'], ['c']],
 [['a', 'b'], ['c'], ['c'], ['d']],
 [['a', 'c', 'c', 'd'], ['b']],
 [['a', 'c', 'c'], ['b', 'd']],
 [['a', 'c', 'c'], ['b'], ['d']],
 [['a', 'c', 'd'], ['b', 'c']],
 [['a', 'c', 'd'], ['b'], ['c']],
 [['a', 'c'], ['b', 'c', 'd']],
 [['a', 'c'], ['b', 'c'], ['d']],
 [['a', 'c'], ['b', 'd'], ['c']],
 [['a', 'c'], ['b'], ['c', 'd']],
 [['a', 'c'], ['b'], ['c'], ['d']],
 [['a', 'd'], ['b', 'c', 'c']],
 [['a', 'd'], ['b', 'c'], ['c']],
 [['a', 'd'], ['b'], ['c', 'c']],
 [['a', 'd'], ['b'], ['c'], ['c']],
 [['a'], ['b', 'c', 'c', 'd']],
 [['a'], ['b', 'c', 'c'], ['d']],
 [['a'], ['b', 'c', 'd'], ['c']],
 [['a'], ['b', 'c'], ['c', 'd']],
 [['a'], ['b', 'c'], ['c'], ['d']],
 [['a'], ['b', 'd'], ['c', 'c']],
 [['a'], ['b', 'd'], ['c'], ['c']],
 [['a'], ['b'], ['c', 'c', 'd']],
 [['a'], ['b'], ['c', 'c'], ['d']],
 [['a'], ['b'], ['c', 'd'], ['c']],
 [['a'], ['b'], ['c'], ['c'], ['d']]]

您的说明有点混乱,但我怀疑您想要的是“排列”或“组合”:

https://docs.python.org/2/library/itertools.html

Python有一个库可以为您实现这一点。你知道吗

output = [itertools.permutations(input, r_) for r_ in range(r)]

相关问题 更多 >