如何在 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']
....
帮助:
将其打印为 ['ago','bgo'] 而不是
与其只更改第一个字母,还不如在索引 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)
我有一个 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'] ....
帮助:
将其打印为 ['ago','bgo'] 而不是
与其只更改第一个字母,还不如在索引 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)