我关注itertools的代码,该代码正在生成组合。我需要更新此代码。有一个小的更新,看起来像这样:
def combinations(iterable, r, degrees):
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = []
for pair in pairs:
if degrees[pair[0]] < 2 and degrees[pair[1]] < 2:
degrees[pair[0]] += 1
degrees[pair[1]] += 1
indices.append(pairs.index(pair))
if len(indices) == r:
break
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
使用此功能,我需要在图形中生成所有可能的边。每个边都表示为元组,例如(1, 2)
。
因此iterable
起作用的参数是所有可能边的列表:
[(5, 7), (5, 8), (5, 9), (5, 10), (5, 11), (5, 12), (6, 7), (6, 8), (6, 9), (6, 10), (6, 11), (6, 12), (7, 9), (7, 10), (7, 11), (7, 12), (8, 9), (8, 10), (8, 11), (8, 12), (9, 11), (9, 12), (10, 11), (10, 12)]
r
参数是组合的长度,在我的情况下为8。
degrees
是一个字典,其中包含每个节点的度数(5,6,7,8,9,10,11,12)。
在现有代码中,首先生成组合((5, 7), (5, 8), (6, 7), (6, 8), (9, 11), (9, 12), (10, 11), (10, 12))
。
在这种情况下:
for pair in pairs:
if degrees[pair[0]] < 2 and degrees[pair[1]] < 2:
degrees[pair[0]] += 1
degrees[pair[1]] += 1
indices.append(pairs.index(pair))
if len(indices) == r:
break
我正在验证每个节点的程度。 不大于2 。有人可以帮助我更改代码的while
部分以生成所有可能的边(我需要像提到的情况一样跳过索引)。
我不能使用itertools,因为它效率很低。我也无法生成所有组合并对其进行过滤。我只需要跳过索引就可以了。