包括嵌套列表的排列
Include permutations of nested lists
我有以下函数来获取列表的排列数(没有重复元素):
import itertools
def permutations_without_repetition(samples, size):
return list(itertools.permutations(samples, size))
只要我提供的列表不包含嵌套列表,这对我来说效果很好。 Itertools 将嵌套元素视为一个整体元素,并且不会生成包含不同顺序嵌套列表的排列。
如果我 运行 permutations_without_repetition([[1, 2], 3], 2)
,我得到的唯一结果是:
[([1, 2], 3), (3, [1, 2])]
我知道这是预期的行为,但我希望结果是:
[([1, 2], 3), (3, [1, 2]), ([2, 1], 3), (3, [2, 1])]
同时 return 包含嵌套列表排列的排列以产生上述结果的最简单方法是什么?
您可以使用递归生成器函数:
def combos(d, c = []):
if not isinstance(d, list):
yield d
elif not d:
yield c
else:
for i, a in enumerate(d):
for k in combos(a, c = []):
yield from combos(d[:i]+d[i+1:], c+[k])
print(list(combos([[1, 2], 3])))
输出:
[[[1, 2], 3], [[2, 1], 3], [3, [1, 2]], [3, [2, 1]]]
使用 itertools
的较短解决方案:
import itertools as it
def combos(d):
if not isinstance(d, list):
yield d
else:
for i in it.permutations(d):
yield from map(list, it.product(*[combos(j) for j in i]))
print(list(combos([[1, 2], 3])))
输出:
[[[1, 2], 3], [[2, 1], 3], [3, [1, 2]], [3, [2, 1]]]
我有以下函数来获取列表的排列数(没有重复元素):
import itertools
def permutations_without_repetition(samples, size):
return list(itertools.permutations(samples, size))
只要我提供的列表不包含嵌套列表,这对我来说效果很好。 Itertools 将嵌套元素视为一个整体元素,并且不会生成包含不同顺序嵌套列表的排列。
如果我 运行 permutations_without_repetition([[1, 2], 3], 2)
,我得到的唯一结果是:
[([1, 2], 3), (3, [1, 2])]
我知道这是预期的行为,但我希望结果是:
[([1, 2], 3), (3, [1, 2]), ([2, 1], 3), (3, [2, 1])]
同时 return 包含嵌套列表排列的排列以产生上述结果的最简单方法是什么?
您可以使用递归生成器函数:
def combos(d, c = []):
if not isinstance(d, list):
yield d
elif not d:
yield c
else:
for i, a in enumerate(d):
for k in combos(a, c = []):
yield from combos(d[:i]+d[i+1:], c+[k])
print(list(combos([[1, 2], 3])))
输出:
[[[1, 2], 3], [[2, 1], 3], [3, [1, 2]], [3, [2, 1]]]
使用 itertools
的较短解决方案:
import itertools as it
def combos(d):
if not isinstance(d, list):
yield d
else:
for i in it.permutations(d):
yield from map(list, it.product(*[combos(j) for j in i]))
print(list(combos([[1, 2], 3])))
输出:
[[[1, 2], 3], [[2, 1], 3], [3, [1, 2]], [3, [2, 1]]]