Получить все комбинации строки в Python

Представьте, что у нас есть строка типа: «хороший студент университета». Нам нужно составить все комбинации слов в этой строке. Нам также необходимо добавить в эти комбинации несколько символов-разделителей. Для пояснения, пожалуйста, посмотрите на пример ниже:

    String: "good university student"
    Separators = ["-","+"]
    Expected results:
    student
    university
    good
    good-university-student
    good-university
    good-student
    university-student
    good+university+student
    good+university
    good+student
    university+student

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

def create_name_combos(mystring):
    words = mystring.split()
    combos = []
    for i in range(len(words) - 1):  
        for separator in ["-", "+", "&"]:
        current_combo = separator.join(words[:i+1] + [separator + words[i+1]])
        combos.append(current_combo)
    return combos

Каким было бы лучшее решение, чтобы получить все возможные комбинации?

Что не так с существующими ответами на stackoverflow.com/questions/78738572/…?

Ry- 13.07.2024 06:27

@Ry- я не знаю, они только что закрыли мой вопрос.

Mahdi Talebi 13.07.2024 06:33

Вы не знаете, что не так с существующими ответами? Попробуйте их и узнаете?

Ry- 13.07.2024 06:33

@Ry- я проверил все ответы, в одном из них указаны не все комбинации, а в другом были ошибки.

Mahdi Talebi 13.07.2024 06:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
105
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать перестановки и комбинации из itertools:

import re
from itertools import permutations, chain, combinations


def create_name_combos(mystring):
    def gen(arr, separators):
        return set({re.sub(r' ', sep, s) for sep in separators for s in arr})

    def get_subsets(words):
        return chain.from_iterable(combinations(words, r) for r in range(1, len(words) + 1))

    words = mystring.split()
    combos = set()
    for subset in get_subsets(words):
        for perm in permutations(subset):
            combos.add(' '.join(perm))

    return sorted(gen(sorted(combos), ("+", '-', '')))


print(create_name_combos('good university student'))

Принты

['хорошо', 'хороший+студент', 'хороший+студент+университет', 'хороший+университет', «хороший+университет+студент», «хороший студент», «хороший студент-университет», «хороший университет», «хороший студент университета», «хороший студент», 'хорошийстудентуниверситет', 'хорошийуниверситет', 'хорошийстудентуниверситет', «студент», «студент+хорошо», «студент+хорошо+университет», 'студент+университет', 'студент+университет+хорошо', 'студент-хорошо', «студент-хороший университет», «студент-университет», 'хороший студент-университет', 'хороший студент-университет', 'хороший студент-университет', 'студенческий университет', 'студенческий университетхороший', 'университет', 'университет+хорошо', 'университет+хорошо+студент', 'университет+студент', «университет+студент+хорошо», «университет-хорошо», «отличник университета», «студент университета», 'хороший студент университета', 'хороший университетский студент', 'хороший студент университета', 'студент университета', 'хороший студент университета']

Можно ли добавлять новые комбинации без разделителя? типа "хороший студент университета"

Mahdi Talebi 13.07.2024 07:31

@MahdiTalebi Попробуйте: sorted(gen(sorted(combos), ("+", '-', '')))

user24714692 13.07.2024 07:33

Требование касается комбинаций, а не перестановок. Поэтому я не уверен, почему это принятый ответ

SIGHUP 13.07.2024 10:29

Но это дает другие комбинации, которых ОП не ожидает в вопросах. (хотя я не минусовал)

Suramuthu R 13.07.2024 11:58

@SuramuthuR Спасибо! Но ОП говорит, что это работает. ОП не перечислил все выходные элементы в вопросе.

user24714692 13.07.2024 14:52

Предполагая, что порядок (последовательность) не имеет значения:

String = "good university student"
str_lst = String.split() # Create a list of words in String
new_ls = [] # A new empty list
L = len(str_lst) # Declared length of str_lst.Just for convenience though not required

for i in range(L):
    new_ls.append(str_lst[i]) # append the single word 
    
    sub = str_lst[i+1:] # Create a substring of words with index > i
    for x in sub: # Iterate thru substring
        
        comb_2 = f'{str_lst[i]}+{x}' # combo joining with '+'
        comb_3 = f'{str_lst[i]}-{x}' # combo joining with '-'
        
        new_ls.append(comb_2) #append combo_1
        new_ls.append(comb_3) #append combo_2
print(new_ls) 

Выход :

['хороший', 'хороший+университет', 'хороший-университет', 'хороший+студент', 'хороший-студент', 'университет', 'университет+студент', 'университет-студент', 'студент']

Вместо new_ls.append почему бы не использовать new_ls.extend и так далее?

toyota Supra 13.07.2024 15:37

@toyotaSupra, кажется, ты шутишь. Строка 7: если используется extend, то должно быть new_ls.extend([str_lst[i]]). Строка 12 должна быть comb_2 = [f'{str_lst[i]}+{x}'], а строка 13 должна быть comb_3 = [f'{str_lst[i]}-{x}']. Почему мы должны это делать? т. е. зачем преобразовывать элементы в список, а затем использовать расширение?

Suramuthu R 13.07.2024 16:55

Потому что я следовал Конвенции Python.

toyota Supra 13.07.2024 20:52

@toyotaSupra, не могли бы вы дать ссылку, в которой предлагается использовать расширение вместо добавления в соответствии с соглашением Python. Без обид, я просто хочу знать.

Suramuthu R 13.07.2024 23:22

Другие вопросы по теме