Представьте, что у нас есть строка типа: «хороший студент университета». Нам нужно составить все комбинации слов в этой строке. Нам также необходимо добавить в эти комбинации несколько символов-разделителей. Для пояснения, пожалуйста, посмотрите на пример ниже:
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
Каким было бы лучшее решение, чтобы получить все возможные комбинации?
@Ry- я не знаю, они только что закрыли мой вопрос.
Вы не знаете, что не так с существующими ответами? Попробуйте их и узнаете?
@Ry- я проверил все ответы, в одном из них указаны не все комбинации, а в другом были ошибки.
Вы можете использовать перестановки и комбинации из 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'))
['хорошо', 'хороший+студент', 'хороший+студент+университет', 'хороший+университет', «хороший+университет+студент», «хороший студент», «хороший студент-университет», «хороший университет», «хороший студент университета», «хороший студент», 'хорошийстудентуниверситет', 'хорошийуниверситет', 'хорошийстудентуниверситет', «студент», «студент+хорошо», «студент+хорошо+университет», 'студент+университет', 'студент+университет+хорошо', 'студент-хорошо', «студент-хороший университет», «студент-университет», 'хороший студент-университет', 'хороший студент-университет', 'хороший студент-университет', 'студенческий университет', 'студенческий университетхороший', 'университет', 'университет+хорошо', 'университет+хорошо+студент', 'университет+студент', «университет+студент+хорошо», «университет-хорошо», «отличник университета», «студент университета», 'хороший студент университета', 'хороший университетский студент', 'хороший студент университета', 'студент университета', 'хороший студент университета']
Можно ли добавлять новые комбинации без разделителя? типа "хороший студент университета"
@MahdiTalebi Попробуйте: sorted(gen(sorted(combos), ("+", '-', '')))
Требование касается комбинаций, а не перестановок. Поэтому я не уверен, почему это принятый ответ
Но это дает другие комбинации, которых ОП не ожидает в вопросах. (хотя я не минусовал)
@SuramuthuR Спасибо! Но ОП говорит, что это работает. ОП не перечислил все выходные элементы в вопросе.
Предполагая, что порядок (последовательность) не имеет значения:
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
и так далее?
@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}']
. Почему мы должны это делать? т. е. зачем преобразовывать элементы в список, а затем использовать расширение?
Потому что я следовал Конвенции Python.
@toyotaSupra, не могли бы вы дать ссылку, в которой предлагается использовать расширение вместо добавления в соответствии с соглашением Python. Без обид, я просто хочу знать.
Что не так с существующими ответами на stackoverflow.com/questions/78738572/…?