2013-08-01 43 views
0

案例:我需要确定三个对象组合是否满足规则。在Python中迭代可变数量的迭代件

为了简单起见,假设某个给定的序列是由发生器函数吐出的项目的任意组合,则该规则满足。生成器处理来自池中的物品将在其每个实例中弹出并且不总是产生相同的物品/订单,因此构建物品列表并使用诸如itertools.combinations之类的东西来生成组合将​​不起作用。

现在我有相当于一个功能:

def is_match_found(sequence): 

    items1 = items_generator() 

    for item1 in items1: 
    items2 = items_generator() 

    for item2 in items2: 
     items3 = items_generator() 

     for item3 in items3: 
     if sequence in [item1, item2, item3]: 
      return True 

    return False 

但我可以预见到的未来,我需要看看n对象的组合吐出由发电机满足的规则。

我感觉好像一个带有n参数的函数实现递归for循环可能是解决这个问题的一个步骤,但是当我去试图找到一个有效的循环时,我的大脑就会崩溃。

有人能指出我正确的方向吗?

+1

你只是在寻找'itertools.product',还是我在这里想念什么? – abarnert

+0

似乎是这项工作的正确工具,当我在电脑前时,我会尝试一下。谢谢! – thismachinechills

回答

0

对于N-许多项目的排列:

def is_match_found(sequence): 
    for itemList in itertools.product(list(item_generator()), repeat=N): 
     if sequence in itemList: 
      return True 
    return False 
+1

“产品”的'repeat'参数仅为关键字,因此这会尝试将'N'视为另一个迭代器,我不认为它是您想要的。 – abarnert

0

如果你要寻找的“以实现递归for循环的n参数的函数”,并通过“递归”你实际上意味着“嵌套“...那么已经存在:itertools.product。事实上,简短说明是偶数:

笛卡儿积,相当于一个嵌套for循环

但它不具有n参数;它有一个iterables参数,它允许您指定尽可能多的单独迭代以根据需要进行嵌套。如果你只是想嵌套相同的迭代n次,你可以通过n副本的列表相同的迭代......但你也可以只使用repeat关键字来指定。如文档所述:

product(A, repeat=4)的含义与product(A, A, A, A)相同。