Python-скрипт для создания каждой комбинации строки с размещенными символами - PullRequest
0 голосов
/ 25 апреля 2018

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

Вывод для строки 1234 будет:

["1234", "1.234", "12.34", "123.4", "1.2.34", "1.23.4" etc. ]

И, очевидно, это должно работать для всех длин строки.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Краткое решение без рекурсии: использование двоичных комбинаций (представьте 0, 1, 10, 11 и т. Д.) Для определения места вставки точек.

Между каждой буквой ставьте точку, если в этом индексе есть 1, и пустую строку, когда есть 0.

your_string = "1234"

def dot_combinations(string):
    i = 0
    combinations = []

    # Iter while the binary representation length is smaller than the string size
    while i.bit_length() < len(string):
        current_word = []
        for index, letter in enumerate(string):
            current_word.append(letter)
            # Append a dot if there's a 1 in this position
            if (1 << index) & i:
                current_word.append(".")
        i+=1
        combinations.append("".join(current_word))
    return combinations

print dot_combinations(your_string)

Выход:

['1234', '1.234', '12.34', '1.2.34', '123.4', '1.23.4', '12.3.4', '1.2.3.4']
0 голосов
/ 25 апреля 2018

Вы должны решить этот тип проблем самостоятельно, это простые алгоритмы для манипулирования данными, которые вы должны знать, как придумать.Однако вот решение (длинная версия для большей ясности):

my_str = "1234"         # original string

# recursive function for constructing dots
def construct_dot(s, t):
    # s - the string to put dots
    # t - number of dots to put

    # zero dots will return the original string in a list (stop criteria)
    if t==0: return [s]

    # allocation for results list
    new_list = []

    # iterate the next dot location, considering the remaining dots.
    for p in range(1,len(s) - t + 1):

        new_str = str(s[:p]) + '.' # put the dot in the location
        res_str = str(s[p:]) # crop the string frot the dot to the end

        sub_list = construct_dot(res_str, t-1) # make a list with t-1 dots (recursive)

        # append concatenated strings
        for sl in sub_list:
            new_list.append(new_str + sl)

    # we result with a list of the string with the dots.
    return new_list

# now we will iterate the number of the dots that we want to put in the string.
# 0 dots will return the original string, and we can put maximum of len(string) -1 dots.
all_list = []
for n_dots in range(len(my_str)):
    all_list.extend(construct_dot(my_str,n_dots))

# and see the results
print(all_list)

Вывод:

['1234', '1.234', '12.34', '123.4', '1.2.34', '1.23.4', '12.3.4', '1.2.3.4']
...