从元组生成特定的输出模式

时间:2017-02-12 16:40:06

标签: python tuples

给出一个Python元组

products = (a, b, c, d, e, f, g)

我试图从'产品'生成新的元组/列表,但根据具体模式:

  1. 所有可能的时间顺序组合,以制作对,例如ab,ac(& so on ...)af,ag,bc等

  2. 类似于#1,但是制作三个一组,并确保增量变为“中间”的两侧。产品相同,例如abc,bcd(& so on ...) ace,bdf,ceg

  3. 四个一组,再次确保增量变化等于中间产品的任何一侧(和之间),例如abcd,bcde(& so on ...) aceg

  4. 从询问并阅读Python的网站,itertools.combinations()函数似乎朝着正确的方向迈出了一步。但鉴于正在寻求创造的特定模式,似乎不仅仅需要其标准使用形式的功能。有什么建议吗?

    P.S。 平均实际元组比上面的例子长几倍(我总共有大约40个元组),以及一些'产品'每个内容都会过期/退出,每隔几周就会添加一个新内容,因此手动将组合输入新元组并不符合自动化的目标。

2 个答案:

答案 0 :(得分:2)

这是一种显而易见的懒惰方式:

>>> products = 'abcdefg'
>>> for length in range(2, 5):
        for step in range(1, 42):
           for start in range(42):
               x = products[start : start+length*step : step]
               if len(x) == length:
                   print x,
        print

ab bc cd de ef fg ac bd ce df eg ad be cf dg ae bf cg af bg ag
abc bcd cde def efg ace bdf ceg adg
abcd bcde cdef defg aceg

如果您使用正确计算的停止值替换if len(x) == length:,则可以删除42检查。

答案 1 :(得分:0)

这是一个单行,其中n是案例编号:

[ products[i:i+j*n+1:j] for j in xrange(1,len(products)/n+1) for i in xrange(len(products)-j*(n-1)) if i+j*n<len(products) ]