具有极限和方向性的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')]