首页 > 解决方案 > 通过添加另一个列表的元素来生成列表的排列

问题描述

我尝试编写一个 Python 代码,它结合了两个不同的列表 C 和 C',以生成可能的排列。我们有一些概念,我在下面列举它们: 1) F 是一个包含模式的列表(我将在示例中显示模式)。2) N 是每个生成的序列中的元素数 3) H 是要从 C' 添加到 C 以生成序列的元素数。

例如,

C=[6,6,5,4,3,2,1]

C'=[1',2',4']

H=3

F=[6,4,5,2,1,3]

N=10

在这个例子中,我们希望通过将 C' 的三个元素添加到 C 来获得长度为 10 的序列。注意,这三个元素也可能是重复元素,例如 [1,2,1]。另一方面,生成的序列应该满足F。F中有一个模式。模式是指F的第一个元素F[0],6应该出现在第二个元素F[1]之前F,4,在生成的序列中。有了这个,我们可以使用一些规则来减少我们需要生成的序列数量。例如,我们只能在第一个位置接受 6,否则生成的序列不满足 F。我们可以在第二个位置接受数字 6 和 4,依此类推。最后,需要保留每个元素在 C 中出现的次数。例如,生成的序列应至少包含两个数字 6、一个数字 5、4、3、2、1。

为了清楚起见,我在下面的示例中解释了所有内容:

通过组合 C 和 C' 可能生成的序列是 [6,4',6,5,2',4,1',3,2,1] 其中 C' 的三个元素,[4',2',1 '],添加到C。生成的序列如何满足F?如果从左边开始遍历元素并忽略重复的元素,那么我们将有[6,4,5,2,1,3],它等于F(它满足F)。此外,在这个例子中,我们至少有两个数字 6,一个数字 5、4、3、2、1。正如我所提到的,应该保留 C 中的元素数量。例如,我无法生成像 [6,4',5,2',4,1',3,2,1,1'] 这样的序列。实际上,该序列满足 F。

呈现的代码没有考虑 C' 和 H 来生成排列。我的代码通过使用 itertools.product(C, repeat=N) 重复 C 的每个可能元素(不组合 C 和 C')来随机生成排列。生成的序列长度为10,满足F。缺少的是1)考虑C'和H来生成序列2)保留C的规则(需要保留每个元素在C中出现的次数.)

import itertools
from collections import deque
import collections
from itertools import product

def Generate_F_From_Lists(constrain):
  F_list=[]
  for u in constrain:
    if u in F_list:
      pass
    else:
      F_list.append(u)
  return F_list

C= [6,6,5,4,3,2,1]
N=10
Satisfied_sequences=[]
F = [6,4,5,2,1,3]
# generate the permutation sequences of size N
for p in itertools.product(C, repeat=N):
         # rules to reduce the number of generated permutation( for example in the first position only 6 is acceptable).
    for constrain in product([6] , [6],[5, 6] ,[4, 5, 6], [3, 4, 5, 6] , [2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]):
        Generated_F=Generate_F_From_Lists(constrain)
        if Generated_F==F:
            Satisfied_sequences.append(constrain)

先感谢您

标签: pythonpython-2.7permutation

解决方案


推荐阅读