2014-01-30 52 views
0

这将是最优雅和Pythonic方式排列5或6列表的元素?排列5(或6)列表

我有一堆像下面这样的列表,其中每个元素都会触发一个AJAX调用。并且当列表3中的元素将被迭代时,他们可能会拉出另一个我需要排列的列表,并且我需要获取所有排列。

列表解析没有讨论,因为我需要在每个调用之间进行一些操作。

我知道itertools.permutations但我正在寻找的东西,会给我更多的控制在每一步。

list1 =['e1', 'e2', 'e3'] 
list2 = ['e1', 'e2', ... , 'e13'] 
list3 = [up to 15 elements] 
variable_list = ['e1', 'e2'] 
list4 = ['e1', 'e2'] 
list5 = ['e1', 'e2', ... , 'e16'] 

这就是我想要对付列表:

values = [[{'0': '25'}, 
     {'0': '50'}, 
     {'0': '75'}, 
     {'0': '100'}, 
     {'0': '250'}, 
     {'0': '500'}, 
     {'0': '750'}, 
     {'0': '1000'}, 
     {'0': '2500'},], 
    [{'1': 'abc|xyz'}], 
    [{'2': 'Color|purple'}, {'2': 'Color|black'}], 
    [{'3': 'yes|no'}, 
     {'3': 'no|yes'}], 
    [{'4': 'Round|no'}, {'4': 'Round|yes'}], 
    [{'5': 'time|4-5'}], 
    [{'Base': 'gl'}], 
    [{'Type': '123'}]] 

值的元素可能会改变的数量,而不是所有的时候都会有这样的长度 - 8个元素,所以我还需要处理。

我需要返回的所有的组合的明细表可能: 下面是从列表中的元件,我需要的一个示例:

[{'0': '25'}, {'1': 'abc|xyz'}, {'2': 'Color|purple'}, {'3': 'yes|no'}, {'4': 'Round|no'}, {'5': 'time|4-5'}, {'Base': 'gl'}, {'Type': '123'}] 

从导致列表中的每个元件的长度必须是与等于在输入列表上的长度(在我的情况下的值)。

我试图itertools.permutation但给我更多的结果比我更需要。另外,我尝试了@markcial建议,但如果我事先不知道输入列表的长度,它就不起作用。

+0

我不知道我明白你的意思,当你说你在每一个需要控制步。您是否正在修改列表,因为您正在生成排列? –

+1

您如何在每一步中更多地控制?排列不是一次计算出来的,而是一次一个地产生它们的发生器。你可以突破部分迭代,它不会继续计算剩余的排列 – mhlester

+0

不,我没有修改它们,但我需要经典for循环,因为在每次迭代中,我需要从AJAX调用中提取一些数据。做到这一点非常重要,而不是随意的。 – jabez

回答

1

你谈论排列和组合,但在我看来,你实际上想要笛卡尔产品,它是由itertools.product产生的。例如:

>>> from itertools import product 
>>> values = [[{'0': '25'}, {'0': '50'}, {'0': '75'}, {'0': '100'}, {'0': '250'}, {'0': '500'}, {'0': '750'}, {'0': '1000'}, {'0': '2500'}], [{'1': 'abc|xyz'}], [{'2': 'Color|purple'}, {'2': 'Color|black'}], [{'3': 'yes|no'}, {'3': 'no|yes'}], [{'4': 'Round|no'}, {'4': 'Round|yes'}], [{'5': 'time|4-5'}], [{'Base': 'gl'}], [{'Type': '123'}]] 
>>> every_choice = list(product(*values)) 
>>> len(every_choice) 
72 

every_choice每个元素是一个元素的元组从每个列表中选择:

>>> every_choice[0] 
({'0': '25'}, {'1': 'abc|xyz'}, {'2': 'Color|purple'}, {'3': 'yes|no'}, {'4': 'Round|no'}, {'5': 'time|4-5'}, {'Base': 'gl'}, {'Type': '123'}) 
>>> every_choice[30] 
({'0': '100'}, {'1': 'abc|xyz'}, {'2': 'Color|black'}, {'3': 'no|yes'}, {'4': 'Round|no'}, {'5': 'time|4-5'}, {'Base': 'gl'}, {'Type': '123'}) 
>>> every_choice[-1] 
({'0': '2500'}, {'1': 'abc|xyz'}, {'2': 'Color|black'}, {'3': 'no|yes'}, {'4': 'Round|yes'}, {'5': 'time|4-5'}, {'Base': 'gl'}, {'Type': '123'}) 
+0

你说得对,我没有知道如何解释我的确切需求。非常感谢! – jabez

0

list comprehension也可以调用函数。您可以这样

def do(*args): 
    print args 
    return args 

列表理解的步骤创建一个函数,然后用列表解析调用与当前步骤的功能:

list1 =['e1', 'e2', 'e3'] 
list2 = ['e1', 'e2', 'e13'] 
[do(a,b) for a in list1 for b in list2] 

后续循环可以用更复杂的程序加入,但主要想法是你可以控制列表理解循环

+1

我会试试这个方法,我会回来的,谢谢 – jabez

+0

我更新了这个问题 – jabez