【问题标题】:enumerating all possible strings of length K from an alphabet in Python [duplicate]从Python中的字母表中枚举所有可能的长度为K的字符串[重复]
【发布时间】:2011-11-25 19:29:10
【问题描述】:

可能重复:
is there any best way to generate all possible three letters keywords

如何从字母 L 中枚举所有长度为 K 的字符串,其中 L 只是一个字符列表?例如。如果L = ['A', 'B', 'C']K = 2,我想枚举所有可能的长度为2 的字符串,这些字符串可以由字母'A''B''C' 组成。它们可以重复使用,所以'AA' 是有效的。

据我所知,这本质上是带有替换的排列。如果有更正确的技术术语,请告诉我....它基本上所有长度为 K 的字符串,您可以通过从字母 L 中选择任何字母并可能重用字母,以一种对顺序(因此 ABBA 不完全相同。)是否有更清晰的方式来说明这一点?

无论如何,我认为解决方案是:

[ ''.join(x) for x in product(L, repeat=K) ]

但我对这个问题的其他答案很感兴趣,尤其是。幼稚的方法与快速的 Pythonic 方法,以及速度考虑因素的讨论。

【问题讨论】:

  • 请写一些代码和/或具体告诉我们您在尝试这样做时遇到了什么问题。
  • 你可以使用递归来做到这一点。
  • 我同意这是重复的,很抱歉错过了它。仍然想知道递归方式来做到这一点,因为在其他线程中没有详细提到
  • 您的编辑使这个问题成为讨论/投票问题——它不再有特定的正确答案,甚至没有特定的问题(“我对……感兴趣”)。这不是本网站的主题。

标签: python combinatorics


【解决方案1】:

这是Python Documentation的一部分

EDIT2:当然正确的答案是产品,感谢您的评论

print  [''.join(x) for x in product('ABC', repeat=3)]

打印 27 个元素

['AAA', 'AAB', 'AAC', 'ABA', 'ABB', 'ABC', 'ACA', 'ACB', 'ACC', 'BAA', 'BAB', 
'BAC', 'BBA', 'BBB', 'BBC', 'BCA', 'BCB', 'BCC', 'CAA', 'CAB', 'CAC', 'CBA', 
'CBB', 'CBC', 'CCA', 'CCB', 'CCC']

@agf gave the right answer before

【讨论】:

  • 看起来不正确 - 如果字母大小(可迭代)为长度 3,并且 r = 3,您会期望 3^3 个序列,但是 len([x for x in combination_with_replacement([ 'A', 'B', 'C'], 3)]) 返回 10。
  • 查看我的编辑,哪个元素会出错? :-)
  • 没有错,但它遗漏了一些。应该有 3^3 或 27 个元素: [ ''.join(x) for x in product('ABC', repeat=3) ] ['AAA', 'AAB', 'AAC', 'ABA', 'ABB'、'ABC'、'ACA'、'ACB'、'ACC'、'BAA'、'BAB'、'BAC'、'BBA'、'BBB'、'BBC'、'BCA'、'BCB '、'BCC'、'CAA'、'CAB'、'CAC'、'CBA'、'CBB'、'CBC'、'CCA'、'CCB'、'CCC']
  • 'ABA''ACA' 等在哪里?请阅读您的链接“组合按字典排序顺序发出。”正确答案是(由我)在stackoverflow.com/questions/7074051/…
  • 谢谢你的权利。链接到你的答案
【解决方案2】:

你可以使用itertools:

n = 3
itertools.product(*['abc']*n)

这为您提供了预期的 27 个元素。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2019-04-16
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多