【发布时间】:2023-04-01 17:51:01
【问题描述】:
我正在尝试对概率系统进行建模。我正在使用的系统涉及三个元素——称它们为“X”、“Y”和“Z”。这些元素以特定类型的交替模式形成字符串,其中 X 必须与 Y 或 Z 交替(即禁止 XX、YY、ZZ、YZ 和 ZY 连接)。我想为不同的字符串长度排列所有可能序列的列表。
我最初的尝试是生成这三个字符的所有可能排列,并过滤掉任何被禁止的模式。不幸的是,对于长序列长度,排列的扩展性很差。我解决了这个问题,方法是生成每个序列,一次一个字符,并检查我在构建序列时提出的条件。这可以防止很早就生成非生产性序列,并大大减少了正在生成的排列的数量。问题是我不是一个编码员,为了实现这个目标,我不得不硬编码一堆嵌套的 for 循环。下面的代码显示了字符串长度为 5。
Length = 5
Units = ['X','Y','Z']
Sequences = []
#aij is the j'th character in the sequence
for i1 in range(len(Units)):
ai1 = n[i1]
for i2 in range(len(Units)):
ai2 = Units[i2]
#If the two most recent sequential units are identical OR (Y and Z) OR (Z and Y), pass
if ai2 == ai1 or ai2==Units[1] and ai1==Units[2] or ai2==Units[2] and ai1==Units[1]:
pass
else:
#repeat for the other characters in the sequence until the final character is reached
for i3 in range(len(Units)):
ai3 = Units[i3]
if ai3 == ai2 or ai3==Units[1] and ai2==Units[2] or ai3==Units[2] and ai2==Units[1]:
pass
else:
for i4 in range(len(Units)):
ai4 = Units[i4]
if ai4 == ai3 or ai4==Units[1] and ai3==Units[2] or ai4==Units[2] and ai3==Units[1]:
pass
else:
for i5 in range(len(Units)):
ai5 = Units[i5]
if ai5 == ai4 or ai5==Units[1] and ai4==Units[2] or ai5==Units[2] and ai4==Units[1]:
pass
else:
#Append the valid sequence to my list of Sequences
a = ai1 + ai2 + ai3 + ai4 + ai5
Sequences.append(a)
print(Sequences)
输出:
['XYXYX', 'XYXZX', 'XZXYX', 'XZXZX', 'YXYXY', 'YXYXZ', 'YXZXY', 'YXZXZ', 'ZXYXY', 'ZXYXZ', 'ZXZXY', 'ZXZXZ']
我的问题是,我怎样才能将这种类型的算法推广到一个简单地接受输入“长度”(即字符串中的字符数)并在列表中生成我的所有序列模式的函数?
【问题讨论】:
标签:
python
permutation
combinatorics
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在 python 中生成特定的排列模式 - Python技术站