Как сделать все возможные комбинации слова в Python

У меня есть текстовый файл со всеми буквами алфавита, который выглядит так:

a

b

c

так далее..

У меня также есть список слов, состоящий всего из 3 букв:

назад

возраст

летучая мышь

сумка

так далее...

Я хочу создать список, который выводит все возможные комбинации, начиная с первого слова назад:

Моя тестовая программа выглядит так:

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

Позже я буду искать все элементы в моем новом списке в словаре, но я могу понять сам, что именно эта часть действительно застряла.


person user3514461    schedule 13.09.2016    source источник
comment
Чтобы присоединиться к строке, используйте join. Например. ''.join(['a', 'g', 'o']) выведет "ago"   -  person Farhan.K    schedule 13.09.2016
comment
Зачем вам нужен текстовый файл со всеми буквами в нем?   -  person Scott Hunter    schedule 13.09.2016
comment
Почему бы не 26*3 строки?   -  person Scott Hunter    schedule 13.09.2016


Ответы (7)


Это создаст список всех комбинаций для данного слова:

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:] )
person Scott Hunter    schedule 13.09.2016
comment
Чтобы получить алфавит from string import ascii_lowercase - person Chris_Rands; 13.09.2016
comment
Спасибо, этот путь короче моего, и мне не пришлось импортировать текстовый файл с алфавитом - person user3514461; 13.09.2016

как @Farhan.K отметил в комментариях, вы ищете строковый метод, который создает новую строку из итерируемого: join

Соединение — это метод строки, в котором он объединяет итерацию, содержащую строки, с этой исходной строкой между ними. например, если у вас есть список слов, которые должны быть предложением, вы можете соединить их, разделив каждое из них пробелом, вызвав ' '.join(listOfWords). В вашем случае у вас есть список символов, которые необходимо соединить без каких-либо разделителей, поэтому вы передаете пустую строку в качестве разделителя: ''.join(listOfChars)

person Aaron    schedule 13.09.2016

здесь с пониманием списка

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

и вы можете определить алфавит с другим пониманием списка

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

возможно, не намного короче, чем писать char за char...

person karakfa    schedule 13.09.2016

Для начала вам понадобятся вложенные циклы. Когда вы поймете, что вы на самом деле пытаетесь сделать, вы увидите пакет 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:]))
person Xxxo    schedule 13.09.2016
comment
Это кажется ужасно запутанным способом получить список букв алфавита. - person Scott Hunter; 13.09.2016
comment
Я думаю, что цель не в том, чтобы взять все буквы алфавита. Пожалуйста, прочитайте еще раз ОП. - person Xxxo; 13.09.2016
comment
txt со всеми буквами алфавита - person Scott Hunter; 13.09.2016
comment
Чувак, цитируй предложение полностью. У меня есть текстовый файл со всеми буквами алфавита. У меня есть! У него есть это, и он хочет чего-то еще. Итак, либо вы по ошибке прокомментируете мой ответ, либо вам придется снова прочитать, что говорит ОП. - person Xxxo; 13.09.2016
comment
Нет, он хочет сделать с ним что-то другое. Возможно, вы должны прочитать комментарии к принятому ответу... - person Scott Hunter; 13.09.2016
comment
ХОРОШО...! Я оставлю это здесь... это отрывок из ОП. ПОМОЩЬ: распечатайте это как ['назад','бго'] вместо того, чтобы просто изменить первую букву, измените ее по одной букве за раз в индексах 0,1 и 2 по одной букве за раз в слове. Вывод должен состоять из 27*3 строк с ['ago','bgo',........,'agx',agy,'agz'] (дружеский совет: вы можете просто признать, что вы не правы ) - person Xxxo; 13.09.2016
comment
Я бы был, если бы был. - person Scott Hunter; 13.09.2016

Я понял! С аккуратным циклом 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)
person user3514461    schedule 13.09.2016

Вам нужно несколько вложенных циклов, чтобы получить комбинации, например:

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']
person kezzos    schedule 13.09.2016

Вы можете попробовать что-то вроде:

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)
person Aaditya Ura    schedule 10.10.2017