python: создать все возможные варианты для строки с дефисами - PullRequest
1 голос
/ 24 апреля 2020

У меня есть список переносимых строк:

(образец)

myList = ['mother-in-law', 'co-operation', 'sixty-nine-eighty-ninths']

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

mother-in law
mother in-law
sixty-nine eighty ninths
sixty-nine-eighty ninths
sixty nine-eighty-ninths
sixty-nine eighty-ninths
sixty nine-eighty ninths
sixty nine eighty-ninths
...

Я пытался найти решение по этому вопросу ( Создать варианты строки ), но я не могу понять, как адаптируйте его:

from itertools import combinations
myList = ['mother-in-law', 'co-operation', 'sixty-nine-eighty-ninths']

for e in myList :
    for i in range(len(e.split("-"))):
        for indices in combinations(range(len(e.split("-"))), i):
            print(''.join([e.split("-")[x] if x in indices else '-' for x in range(len(e))]))

Вот что я получаю:

-------------
mother------------
-in-----------
--law----------
motherin-----------
mother-law----------
-inlaw----------
------------
co-----------
-operation----------
------------------------
sixty-----------------------
-nine----------------------
--eighty---------------------
---ninths--------------------
sixtynine----------------------
sixty-eighty---------------------
sixty--ninths--------------------
-nineeighty---------------------
-nine-ninths--------------------
--eightyninths--------------------
sixtynineeighty---------------------
sixtynine-ninths--------------------
sixty-eightyninths--------------------
-nineeightyninths--------------------

Спасибо

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Рассматривая немного инструментов, которые предоставляет itertools, я обнаружил, что продукт может быть наиболее полезным здесь. Это позволяет нам go использовать все возможности наличия пробела или да sh между двумя словами.

from itertools import product, zip_longest

my_list = ['mother-in-law', 'co-operation', 'sixty-nine-eighty-ninths']
symbols = ' ', '-'

for string in my_list:
    string_split = string.split('-')
    for symbols_product in product(symbols, repeat=len(string_split)-1):
        if '-' not in symbols_product:
            continue
        rtn = ""
        for word, symbol in zip_longest(string_split, symbols_product, fillvalue=''):
            rtn += word + symbol
        print(rtn)
    print()

Кроме того, я пропускаю итерации, где нет да sh между любыми два слова, согласно вашему запросу.

Вывод:

mother in-law
mother-in law
mother-in-law

co-operation

sixty nine eighty-ninths
sixty nine-eighty ninths
sixty nine-eighty-ninths
sixty-nine eighty ninths
sixty-nine eighty-ninths
sixty-nine-eighty ninths
sixty-nine-eighty-ninths
1 голос
/ 24 апреля 2020

Может быть немного проще просто создать собственный генератор для создания комбинаций. Это можно сделать очень читабельным способом с помощью рекурсивного генератора, если ваши строки недостаточно гигантские c для работы в пределах стека:

def hyphenCombos(s):
    head, _, rest = s.partition('-')
    if len(rest) == 0:
        yield head
    else:
        for c in hyphenCombos(rest):
            yield f'{head}-{c}'
            yield f'{head} {c}'

s = 'sixty-nine-eighty-ninths'
list(hyphenCombos(s))

Результат:

['sixty-nine-eighty-ninths',
 'sixty nine-eighty-ninths',
 'sixty-nine eighty-ninths',
 'sixty nine eighty-ninths',
 'sixty-nine-eighty ninths',
 'sixty nine-eighty ninths',
 'sixty-nine eighty ninths',
 'sixty nine eighty ninths']

С этим вы можете использовать его в понимании или передать его другим itertools функциям, чтобы делать все, что вам нужно:

myList = ['mother-in-law', 'co-operation', 'sixty-nine-eighty-ninths']
chain.from_iterable(hyphenCombos(s) for s in myList))
# or variations...
# [list(hyphenCombos(s)) for s in myList]
...