使用迭代工具的嵌套推导



我想创建一个列表,其中包含一组 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)

最新更新