Python 生成 n 个列表的所有 n 个排列
Python generate all n-permutations of n lists
我有 n 个不同长度的列表,我想创建所有可能的排列。
所以例如如果 a=[1,2]
和 b=[3,4,5]
那么我很想获得 res=[[1,3],[1,4],[1,5],[2,3],[2,4],[2,5]]
我一直在尝试使用递归函数来实现这一点,结果证明它既不是很有效也不是很 pythonic。
有经验的 python 程序员会如何解决这个问题?
它被称为两个序列的Cartesian product。
这已在 Python 中作为库函数提供:itertools.product
。
示例:
>>> import itertools
>>> a = [1, 2]
>>> b = [3, 4, 5]
>>> list(itertools.product(a, b))
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
你可以通过 itertools 中的乘积函数来完成,
import itertools
a = [1,2]
b = [3, 4, 5]
out = list(itertools.product(a,b))
print out
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
itertools 绝对是个不错的选择,但如果你不想走简单的路......
def print_permutations(lists, perms=[]):
if not lists:
print perms
else:
current_layer = lists[0]
remaining_layers = lists[1:]
for word in current_layer:
print_permutations(remaining_layers, perms + [word])
l = (('quick', 'lazy'), ('brown', 'black', 'grey'), ('fox', 'dog'))
print_permutations(l)
我有 n 个不同长度的列表,我想创建所有可能的排列。
所以例如如果 a=[1,2]
和 b=[3,4,5]
那么我很想获得 res=[[1,3],[1,4],[1,5],[2,3],[2,4],[2,5]]
我一直在尝试使用递归函数来实现这一点,结果证明它既不是很有效也不是很 pythonic。
有经验的 python 程序员会如何解决这个问题?
它被称为两个序列的Cartesian product。
这已在 Python 中作为库函数提供:itertools.product
。
示例:
>>> import itertools
>>> a = [1, 2]
>>> b = [3, 4, 5]
>>> list(itertools.product(a, b))
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
你可以通过 itertools 中的乘积函数来完成,
import itertools
a = [1,2]
b = [3, 4, 5]
out = list(itertools.product(a,b))
print out
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
itertools 绝对是个不错的选择,但如果你不想走简单的路......
def print_permutations(lists, perms=[]):
if not lists:
print perms
else:
current_layer = lists[0]
remaining_layers = lists[1:]
for word in current_layer:
print_permutations(remaining_layers, perms + [word])
l = (('quick', 'lazy'), ('brown', 'black', 'grey'), ('fox', 'dog'))
print_permutations(l)