使用itertools的特殊组合类型

时间:2010-08-17 19:31:18

标签: python itertools

我差不多完成了一个有人给我的任务,起初很容易使用itertools的product()函数。 然而,这个人要求它也应该做一些有点不同的事情:

li =

[[1,2,3],
[4,5,6]]

常规产品()会给出类似的东西:[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[ 3,4] ......

它应该做的是:

执行常规产品(),然后,添加列表中第一个元素的下一个项目,依此类推。一套完整的例子是:

[[1,4,2]
[1,4,3],
[1,5,2],
[1,5,3],
[2,4,3],
[2,5,3],
[2,6,3]]

在这种情况下我应该如何使用itertools?

编辑:

如果我解释该计划的目标可能会有所帮助: 例如,用户将输入5行乘6列的数字列表 普通产品()将产生5个数字组合。这个人想要一个6号组合。这个“第6”号码来自哪里?这可能来自他选择他想要的那一行。

2 个答案:

答案 0 :(得分:1)

我想知道你表演的神奇计算是什么,但它看起来就像是你的公式:

k = int(raw_input('From What row items should be appeared again at the end?'))
res = [l for l in product(*(li+[li[k]])) if l[k]<l[len(li)] ]

答案 1 :(得分:1)

对两个以上子列表进行广义化(地图函数将是另一个替代)

from pprint import pprint
for li in ([[1, 2, 3],
            [4, 5, 6]],

           [[1,  2,  3,  4],
            [5,  6,  7,  8],
            [9, 10, 11, 12]]
           ):
    triples= []
    prevlist=li[0]
    for nextlist in li[1:]:
        for spacing in range(1,len(prevlist)):
            triples.extend([[first,other,second]
                            for first,second in zip(prevlist,prevlist[spacing:])
                            for other in nextlist])

    pprint(sorted(triples))