给定一个Python列表列表,找到所有可能的保持每个子列表顺序的平面列表?
我有一个列表列表。我想找到所有保持每个子列表顺序的平面列表。举个例子,假设我有一个这样的列表:
ll = [['D', 'O', 'G'], ['C', 'A', 'T'], ['F', 'I', 'S', 'H']]
获得一个解决方案是微不足道的。我设法编写了以下代码,它可以生成一个随机的平面列表,该列表保持每个子列表的顺序。
import random
# Flatten the list of lists
flat = [x for l in ll for x in l]
# Shuffle to gain randomness
random.shuffle(flat)
for l in ll:
# Find the idxs in the flat list that belongs to the sublist
idxs = [i for i, x in enumerate(flat) if x in l]
# Change the order to match the order in the sublist
for j, idx in enumerate(idxs):
flat[idx] = l[j]
print(flat)
这可以生成如下所示的平面列表:
['F', 'D', 'O', 'C', 'A', 'G', 'I', 'S', 'T', 'H']
['C', 'D', 'F', 'O', 'G', 'I', 'S', 'A', 'T', 'H']
['C', 'D', 'O', 'G', 'F', 'I', 'S', 'A', 'T', 'H']
['F', 'C', 'D', 'I', 'S', 'A', 'H', 'O', 'T', 'G']
如您所见,'A'总是出现在 之后'C','T'总是出现在 之后'A','O'总是出现在 之后'D',等等......
但是,我想获得所有可能的解决方案。
请注意:
- 我想要一个适用于任何给定列表列表的通用代码,而不仅仅是“狗猫鱼”;
- 是否有复制品并不重要,因为每个项目都是可区分的。
任何人都可以为此建议一个快速的 Python 算法吗?