【问题标题】:Generating specific output patterns from a tuple从元组生成特定的输出模式
【发布时间】:2017-02-12 16:40:06
【问题描述】:

给定一个 Python 元组

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

我试图从“产品”中生成一个新的元组/列表,但要根据特定的模式:

  1. 所有可能的按时间顺序排列的组合,例如ab, ac (& 等等...) af, ag, bc, 等等

  2. 类似于 #1,但以三组为一组,并确保“中间”产品任一侧的增量变化相等,例如abc, bcd (& 等等...) ace, bdf, ceg

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

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

附: 平均实际元组比上面的例子长几倍(我总共有大约 40 个元组),每个元组中的一些“产品”会过期/退出,每隔几周就会添加新的,因此手动将组合输入到新元组中不符合自动化的目标。

【问题讨论】:

  • 请添加您的代码,如果您不显示您所做的,我们将无法帮助您。
  • 我投票结束这个问题,因为 Stackoverflow 不是代码编写服务。
  • Jarvis,我还没有编写任何代码,至少没有针对这些模式。
  • 否,但其中许多已关闭(或应该关闭)。 stakcoverflow 也不是一个教程网站。你需要做更多的阅读和研究……而不是开始要求别人为你编写代码(或者告诉你如何编写代码,这几乎是一回事)。
  • @Martineau - 哦,真的吗?有点像您在其他线程中所做的(例如“Tkinter 如何将 TTK 按钮更改为粗体?”)?

标签: python tuples


【解决方案1】:

这是一种明显的懒惰方式:

>>> 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

如果你用正确计算的停止值替换我的42,你可以去掉if len(x) == length:检查。

【讨论】:

  • 42 到底是从哪里来的?
  • @ScottHunter “银河系漫游指南”敲响了警钟?
  • @schwobaseggl 加上 OP 说了一些关于 40 号的东西,所以感觉差不多。
【解决方案2】:

这是一个单行代码,其中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) ]

【讨论】:

  • 非常感谢,斯科特!
猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多