【问题标题】:Using itertools to create all combinations up to a value使用 itertools 创建所有组合直到一个值
【发布时间】:2015-07-01 08:51:22
【问题描述】:

我有这个代码:

return [reduce(lambda x,y: str(x)+str(y), perm) 
        for perm in itertools.combinations(alphabet, n)]

我的问题是我希望它适用于不超过 n 的所有值。这是家庭作业,我无法将其设为单行 Pythonic 语句。我将如何以这种方式继续,以便我可以添加如下语句:

 return [reduce(lambda x,y: str(x)+str(y), perm) 
         for perm in itertools.combinations(alphabet, n) for n in range(1,n+1)] 

除了一个真正有效的?

【问题讨论】:

  • 排列或组合? Itertools 两者都提供,我相信
  • 只为这个组合工作
  • 在stackoverflow上发布你的作业?你的老师同意吗?
  • 然后修正你的问题的标题
  • 另外,您能否澄清一下所有值的含义,直到 n? n 是什么?如果它是一个变量,它的值是什么?还有你期望的输出是什么?

标签: python list lambda list-comprehension itertools


【解决方案1】:

这样的?

>>> from itertools import combinations, chain
>>> limit = 10
>>> c = chain(*(combinations(alphabet, x) for x in range(1, limit+1)))
>>> list(c)

我不会显示输出,它太长了。

编辑:根据您上面的 cmets,您似乎希望以字符串的形式输出,所以

[''.join(s) for s in chain(*(combinations(alphabet, x) for x in range(1, limit+1)))]

【讨论】:

  • 你肯定有帮助,我一直在努力格式化它,我必须更多地研究链,但这会让我朝着正确的方向前进。
  • @Rob 我做了一个编辑,向您展示如何使用列表推导将combinations 输出的元组转换为使用str.join 的字符串。
  • itertools.chain 只是将多个可迭代对象连接在一起。 (combinations(alphabet, x) for x in range(1, limit+1)) 为您提供一组组合生成器:一个可迭代长度为 1 的所有组合,另一个可迭代长度为 2 的组合等。然后 chain 将它们加入一个长列表。
  • 这是我的最终答案,以防其他人好奇:return [reduce(lambda x,y: str(x)+str(y), perm) for perm in (itertools.chain(* (itertools.combinations(alphabet, x) for x in range(1, n+1))))]
  • @Rob 您是否使用reduce 只是将值作为字符串连接在一起?以更简单的方式查看我的帖子的编辑。
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多