【问题标题】:How to make all possible combinations of a word in Python如何在 Python 中制作单词的所有可能组合
【发布时间】:2017-01-21 03:05:56
【问题描述】:

我有一个 txt 文件,其中包含字母表中的所有字母,如下所示:

一个

b

c

等等。

我还有一个只有 3 个字母长的单词列表:

以前

年龄

蝙蝠

等等……

我想创建一个列表,打印出从第一个单词 ago 开始的所有可能的组合:

我的测试程序如下所示:

allcombi=[]
s= list("ago")
the.list=[]
with open("alfabeth.txt", "r", encoding = "utf-8") as letters:
    for line in letters:
        letter = line.strip()
        s[0]=letter
        print(s)

现在我只更改第一个字母,但我很难尝试加入这些字母,因为它看起来像这样:

['a', 'g', 'o'] ['b', 'g', 'o'] ....

帮助:

  1. 改为 ['ago','bgo'] 打印出来

  2. 不要只更改第一个字母,而是在索引 0,1 和 2 中一次更改一个字母,在单词中一次更改一个字母。输出应该是 27*3 行,带有 ['ago','bgo',........,'agx',agy,'agz']

我稍后会在字典中搜索我的新列表中的所有项目,但我自己可以弄清楚,这只是这部分让我真正陷入困境。

【问题讨论】:

  • 要加入一个字符串,使用join。例如。 ''.join(['a', 'g', 'o']) 将输出"ago"
  • 为什么需要一个包含所有字母的文本文件?
  • 为什么没有 26*3 行?
  • letter = line.striplines()?

标签: python string list replace letter


【解决方案1】:

正如@Farhan.K 放入 cmets 中一样,您正在寻找的是一个字符串方法,它可以从可迭代对象中创建一个新字符串:join

Join 是字符串的一种方法,它连接一个包含字符串的可迭代对象,其中原始字符串位于它们之间。例如,如果您有一个要成为句子的单词列表,您可以通过调用' '.join(listOfWords) 将它们连接起来,并用空格分隔每个单词。在您的情况下,您有一个需要在没有任何分隔符的情况下连接的字符列表,因此您传递一个空字符串作为分隔符:''.join(listOfChars)

【讨论】:

    【解决方案2】:

    这将生成给定单词的所有组合的列表:

    from string import ascii_lowercase
    word = "ago"
    combos = []
    for i in xrange(len(word)):
        for l in ascii_lowercase:
            combos.append( word[:i]+l+word[i+1:] )
    

    【讨论】:

    • 获取字母表from string import ascii_lowercase
    • 谢谢,这种方式比我的短,而且我不必导入带有 alfabet 的 txt 文件
    【解决方案3】:

    这里是列表理解

    [b+'g'+e for b in alphabet for e in alphabet]
    

    你可以用另一个列表理解来定义字母

    alphabet=[chr(c) for c in range(ord('a'),ord('z')+1)]
    

    也许不会比逐个字符写短多少...

    【讨论】:

      【解决方案4】:

      初学者需要嵌套循环。当您掌握了您实际尝试做的事情时,您可以看到 itertools 包。

      使用您提供的代码,您应该需要以下内容:

      s = list('ago')
      the_list=[]
      with open("alfabeth.txt", "r", encoding = "utf-8") as letters:
          lines = [line for line in letters]
      
      for i in range(len(s)):
          for ii in lines:
              tmp_s = list(s)
              tmp_s[i] = ii
              print(''.join(tmp_s))
      

      而使用 itertools 这变成:

      from itertools import product
      
      s = list('ago')
      with open("alfabeth.txt", "r", encoding = "utf-8") as letters:
          lines = [line.strip() for line in letters]
      
      for i in product(range(len(s)), lines):
          print(''.join(s[:i[0]] + [i[-1]] + s[i[0] + 1:]))
      

      【讨论】:

      • 这似乎是一种非常复杂的获取字母列表的方法。
      • 我认为目标是不要取所有字母。请再读一遍OP。
      • "包含所有字母的txt文件"
      • 老兄,请引用整句话。 “我有一个包含字母表中所有字母的 txt 文件”。 “我有”!他有这个并且想要别的东西。因此,要么您错误地评论了我的答案,要么您必须再次阅读 OP 所说的内容。
      • 不,他想用它做点别的。也许应该阅读接受答案的cmets...
      【解决方案5】:

      我想通了!也有一个整洁的while循环。好骄傲。无论如何都在这里发布答案。

          allakombi=[]
      s= list("söt")#startord
      characters=[]
      with open("alfabetet.txt", "r", encoding = "utf-8") as bokstäver:
              for rad in bokstäver:
                     bokstav = rad.strip()
                     characters.append(bokstav)
      
      k=0
      while k<3:
             i=0
             while i <len(characters):
                    s= list("söt")
                    s[k]=characters[i]
                    i=i+1
                    s="".join(s)
                    allakombi.append(s)
             k=k+1
      
      
      print(allakombi)
      

      【讨论】:

        【解决方案6】:

        您需要几个嵌套循环来获取组合,例如:

        from string import ascii_lowercase
        
        words = ["ago"]
        combs = []
        for word in words:
            for i, letter in enumerate(word):
                for l in ascii_lowercase:
                    tmp = list(word)
                    tmp[i] = l
                    combs.append("".join(tmp))
        
        print combs
        
        
        
        >>> ['ago', 'bgo', 'cgo', 'dgo', 'ego', 'fgo', 'ggo', 'hgo', 'igo', 'jgo', 'kgo', 'lgo', 'mgo', 'ngo', 'ogo', 'pgo', 'qgo', 'rgo', 'sgo', 'tgo', 'ugo', 'vgo', 'wgo', 'xgo', 'ygo', 'zgo', 'aao', 'abo', 'aco', 'ado', 'aeo', 'afo', 'ago', 'aho', 'aio', 'ajo', 'ako', 'alo', 'amo', 'ano', 'aoo', 'apo', 'aqo', 'aro', 'aso', 'ato', 'auo', 'avo', 'awo', 'axo', 'ayo', 'azo', 'aga', 'agb', 'agc', 'agd', 'age', 'agf', 'agg', 'agh', 'agi', 'agj', 'agk', 'agl', 'agm', 'agn', 'ago', 'agp', 'agq', 'agr', 'ags', 'agt', 'agu', 'agv', 'agw', 'agx', 'agy', 'agz']
        

        【讨论】:

          【解决方案7】:

          你可以试试这样的:

          letter=["ago"]
          
          from string import ascii_lowercase
          
          for i in ascii_lowercase:
              print(i+letter[0][1:])
              print(letter[0][:1]+i+letter[0][2:])
              print(letter[0][:2]+i)
          

          【讨论】:

            猜你喜欢
            • 2022-08-24
            • 1970-01-01
            • 2011-05-16
            • 1970-01-01
            • 2015-07-26
            • 1970-01-01
            • 2018-02-02
            • 2014-12-23
            • 1970-01-01
            相关资源
            最近更新 更多