如何在 Python 中生成所有可能的单词组合

How to make all possible combinations of a word in Python

我有一个 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']

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

正如 @Farhan.K 在评论中所说,您正在寻找的是一个字符串方法,它从一个可迭代对象创建一个新字符串:join

Join 是一种字符串方法,它将包含字符串的可迭代对象与它们之间的原始字符串连接起来。例如,如果你有一个要作为句子的单词列表,你可以通过调用 ' '.join(listOfWords) 将它们与 space 分隔开。在你的例子中,你有一个需要连接的字符列表,没有任何分隔符,所以你传递一个空字符串作为分隔符:''.join(listOfChars)

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

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:] )

这里有列表理解

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

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

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

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

初学者需要嵌套循环。当您掌握了实际尝试做的事情时,您可以看到 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:]))

我想通了!也有一个整洁的 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)

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

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

您可以尝试类似的方法:

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)