我想创建一个列表,其中包含一组 5 个顶点中长度为 2 的所有路径的顶点.
需要做的很清楚:列出每个 3 个顶点子集的所有排列。
itertools 提供了通过 itertools.portfolio 生成所有子集和生成所有排列的方法。
单独生成推导很容易:
import itertools as iter
p = [i for i in iter.permutations(range(5))]
q = [j for j in iter.combinations(range(5),3)]
但是我怎样才能实现类似的东西
import itertools as iter
c= [ j for sub in list(list(iter.permutations(i)) for i in list(iter.combinations(range(5),3))) for j in sub]
以更简单,即更紧凑的方式?
正如@JeffH注释中指出的那样,将大小参数传递给permutations
似乎直接执行了您的要求:
import itertools
vs = ['v1', 'v2', 'v3', 'v4']
L1 = list(itertools.permutations(vs, 3))
print(L1)
显示
[('v1', 'v2', 'v3'), ('v1', 'v2', 'v4'), ('v1', 'v3', 'v2'), ('v1', 'v3', 'v4'),
('v1', 'v4', 'v2'), ('v1', 'v4', 'v3'), ('v2', 'v1', 'v3'), ('v2', 'v1', 'v4'),
('v2', 'v3', 'v1'), ('v2', 'v3', 'v4'), ('v2', 'v4', 'v1'), ('v2', 'v4', 'v3'),
('v3', 'v1', 'v2'), ('v3', 'v1', 'v4'), ('v3', 'v2', 'v1'), ('v3', 'v2', 'v4'),
('v3', 'v4', 'v1'), ('v3', 'v4', 'v2'), ('v4', 'v1', 'v2'), ('v4', 'v1', 'v3'),
('v4', 'v2', 'v1'), ('v4', 'v2', 'v3'), ('v4', 'v3', 'v1'), ('v4', 'v3', 'v2')]
但是,如果permutations()
没有第二个参数,你可以通过其他1语句组合获得相同的效果(尽管顺序可能不同(;例如,
L2 = list(itertools.chain.from_iterable(
map(itertools.permutations,
itertools.combinations(vs, 3))))
assert len(L1) == len(L2)
assert set(L1) == set(L2)