Python 3.x 基于itertools的嵌套理解

Python 3.x 基于itertools的嵌套理解,python-3.x,list-comprehension,itertools,Python 3.x,List Comprehension,Itertools,我想创建一个列表,其中包含一组5个顶点中长度为2的所有路径的顶点。 需要做的事情很清楚:列出3个顶点的每个子集的所有排列 itertools提供了通过itertools.compositions生成所有子集和生成所有置换的方法 单独生成理解很容易: import itertools as iter p = [i for i in iter.permutations(range(5))] q = [j for j in iter.combinations(range(5),3)] 但

我想创建一个列表,其中包含一组5个顶点中长度为2的所有路径的顶点。
需要做的事情很清楚:列出3个顶点的每个子集的所有排列

itertools提供了通过itertools.compositions生成所有子集和生成所有置换的方法

单独生成理解很容易:

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在一篇评论中所指出的,将一个size参数传递给
置换
似乎可以直接满足您的要求:

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()
没有第二个参数,您可以通过其他单语句组合获得相同的效果(尽管顺序可能不同);e、 g

L2 = list(itertools.chain.from_iterable(
          map(itertools.permutations,
              itertools.combinations(vs, 3))))
assert len(L1) == len(L2)
assert set(L1) == set(L2)

正如@JeffH在一篇评论中所指出的,将size参数传递给
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()
没有第二个参数,您可以通过其他单语句组合获得相同的效果(尽管顺序可能不同);e、 g

L2 = list(itertools.chain.from_iterable(
          map(itertools.permutations,
              itertools.combinations(vs, 3))))
assert len(L1) == len(L2)
assert set(L1) == set(L2)

现在还不清楚你想用嵌套理解做什么。。。你想实现什么?为什么
列表(itertools.permutations(范围(5),3))
不是正确答案?不清楚你想用嵌套理解做什么。。。你想达到什么目的?为什么列表(itertools.permutations(range(5),3))不是正确的答案?关于排列的第二个参数的提示正是我在紧凑性方面所希望的。关于排列的第二个参数的提示正是我在紧凑性方面所希望的。