首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清单5(或6)

清单5(或6)
EN

Stack Overflow用户
提问于 2014-01-30 20:48:29
回答 2查看 144关注 0票数 0

哪一种方法是最优雅和毕达通的方式,以改变元素的5或6个列表?

我有一堆列表,如下所示,其中每个元素都将触发一个AJAX调用。当列表3中的元素被迭代时,他们可能会取出另一个列表,我也需要修改,我需要得到所有可能的排列。

列表理解是没有讨论的,因为我需要在每个电话之间做一些操作。

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

代码语言:javascript
复制
list1 =['e1', 'e2', 'e3']
list2 = ['e1', 'e2', ... , 'e13']
list3 = [up to 15 elements]
variable_list = ['e1', 'e2']
list4 = ['e1', 'e2']
list5 = ['e1', 'e2', ... , 'e16']

这是我要处理的清单:

代码语言:javascript
复制
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个元素,所以我也需要处理这个问题。

我需要返回一个包含所有可能组合的列表:下面是我需要的列表中元素的一个示例:

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

结果列表中的每个元素的长度必须与输入列表上的长度相等(在我的例子中是值)。

我试过itertools.permutation,但结果比我需要的要多。此外,我尝试了@ work的建议,但是如果我不知道前面输入列表的长度,它就无效了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-12 21:00:09

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

代码语言:javascript
复制
>>> 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的每个元素都是元组,从每个列表中选择一个元素:

代码语言:javascript
复制
>>> 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'})
票数 1
EN

Stack Overflow用户

发布于 2014-01-30 21:02:27

列表理解也可以调用函数。可以为列表理解步骤创建一个函数,如下所示

代码语言:javascript
复制
def do(*args):
    print args
    return args

然后,使用列表理解调用当前步骤的函数:

代码语言:javascript
复制
list1 =['e1', 'e2', 'e3']
list2 = ['e1', 'e2', 'e13']
[do(a,b) for a in list1 for b in list2]

后续循环可以添加更复杂的例程,但主要思想是可以控制列表理解循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21467126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档