【发布时间】:2020-04-20 18:04:20
【问题描述】:
我正在尝试创建一个算法,以从具有 len(L) 值的列表 L 中创建长度 = N 的唯一组。
编辑:唯一组是一个组,其中任何值以前从未与组中的任何值一起使用。
编辑:因此,如果不是价值观,我们将拥有人,那么小组中的任何人都应该始终只结识新小组中的新人。
假设我们有一个列表 L 并尝试找到 4 个唯一组:
L = [1,2,3,4,5,6,7,8]
N = 4
unique_groups = [[1,2,3,4], [5,6,7,8]]
len(unique_groups) = 2
所以这里我们有 8 个值和 2 个唯一组,任何新组都将包含至少一个包含在前一个组中的值,例如[1,2,3,5] 或 [1,3,5,7] 至少包含两个之前的值,因此这些组不是唯一的。
其中 len(L) = 12,我们有 3 个不同的组,而 len(L) >= 16 为我们提供了更多选择:
L = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
N = 4
unique_groups = [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16], [1,5,9,13], [2,3,7,12] ...]
len(unique_groups) = ?
我尝试了一些不直观且缓慢的方法,即比较所有组合,如果列表长度变大,这将花费大量时间。 这是其中一种方法:
def findsubsets(s, n):
return list(itertools.combinations(s, n))
s = [1,2,3,4,5,6,7,8]
sets = findsubsets(s,4)
sets_unique = []
def compare_sets(set1, set2):
init_eq = 0
for s1 in set1:
if s1 in set2 and init_eq > 0:
return False
elif s1 in set2 and init_eq < 1:
init_eq += 1
else:
continue
return True
for s in sets:
start_point = sets.index(s)
print(start_point)
for i in range(start_point + 1, len(sets) + 1):
set2 = sets[i]
if compare_sets(s, set2):
print(s, set2)
sets_unique.append(set2)
print(sets_unique)
EDIT2:这个现实生活中的问题是匹配一组 N 中的员工,所以这些组永远不会包含两个相同的人。每个人都应该只结识新朋友。
【问题讨论】:
-
为什么
[5,6,7,8]和[1,5,9,13]是独一无二的?它们不包含一些共同的元素吗? -
你在创建列表元素的组合吗?
-
我没有很好地说明我所说的独特性。它必须是一个群体,其中价值观在一个群体中“从未见过”。所以@DaniMesejo,这两组是独一无二的,因为 5 只有 6,7,8,然后是 1,9,13
标签: python list algorithm set combinations