具有极限和方向性的Python置换

具有极限和方向性的Python置换,python,python-2.7,Python,Python 2.7,所以我有一个问题,我不能让我的头左右,所以我只能给你伪代码最多 lista=(a,b,c) listb=(a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3) 我需要一种方法将listsb的排列结果限制在以下标准内: 仅包含在lista中的项的元组 lista的顺序需要保留 排列只能向右看 列表A和列表b可以是任意长度 例如: 可接受的: a1、b1、c1 a2、b3、c3 不可接受: a1、b1、d1 a2、b1、c3 b2、a2、c3 我们将非常感谢您的任何想法! 谢谢

所以我有一个问题,我不能让我的头左右,所以我只能给你伪代码最多

lista=(a,b,c)
listb=(a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3)
我需要一种方法将listsb的排列结果限制在以下标准内: 仅包含在lista中的项的元组 lista的顺序需要保留 排列只能向右看 列表A和列表b可以是任意长度

例如:

可接受的:

a1、b1、c1

a2、b3、c3

不可接受:

a1、b1、d1

a2、b1、c3

b2、a2、c3

我们将非常感谢您的任何想法!
谢谢

我不确定是否要称这些为“排列”,因为似乎每个组合中您只需要一个

也许最简单的方法就是编写自己的递归生成器。我使用字符串操作和
startswith
来确定
lista
listb
之间的关联;如果您有不同的对象,您可以按自己的意愿执行此操作

lista=('a','b','c')
listb=('a1','b1','c1','d1','a2','b2','c2','d2','a3','b3','c3','d3')

def gen_combos(li, keepers, builder=tuple()):
    if not keepers:
        yield builder
    else:
        for i,x in enumerate(li):
            if x.startswith(keepers[0]):
                for combo in gen_combos(li[i+1:], keepers[1:], builder + (x,)):
                    yield combo
演示:

list(gen_combos(listb, lista))
Out[40]: 
[('a1', 'b1', 'c1'),
 ('a1', 'b1', 'c2'),
 ('a1', 'b1', 'c3'),
 ('a1', 'b2', 'c2'),
 ('a1', 'b2', 'c3'),
 ('a1', 'b3', 'c3'),
 ('a2', 'b2', 'c2'),
 ('a2', 'b2', 'c3'),
 ('a2', 'b3', 'c3'),
 ('a3', 'b3', 'c3')]