Создать список слов с известными символами - PullRequest
0 голосов
/ 04 мая 2020

Я хочу написать фрагмент кода в Javascript или Python, который генерирует файл списка слов из заранее определенной комбинации символов.

Например, input = abc output = ABC abc Abc aBc abC AbC ABc aB C

Я очень хорошо c знаю любой из них, так что вся помощь приветствуется.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Простой подход с использованием генераторов и без библиотечного кода. Он возвращает генератор (объект, подобный итератору), но может быть легко преобразован в список.

def lU(s):
    if not s:
        yield ''
    else:
        for sfx in lU(s[1:]):
            yield s[0].upper() + sfx
            yield s[0].lower() + sfx

print list(lU("abc"))

Обратите внимание, что все подсписки суффиксов не полностью раскрыты, но количество объектов генератора ( каждый постоянный размер), которые генерируются, пропорциональны длине строки.

0 голосов
/ 04 мая 2020

Я предполагаю, что вы можете импортировать Python пакетов. Поэтому взгляните на itertools.product:

Этот инструмент вычисляет декартово произведение входных итераций.

Например, product (A, B) возвращает то же, что и (( x, y) вместо x в A для y в B).

Это похоже на то, что вы ищете, верно? Это все возможные комбинации из двух разных списков.

Поскольку вы новичок в Python, я предполагаю, что вы не знаете, что такое map. Нет ничего сложного для понимания:

Возвращает список результатов после применения данной функции к каждому элементу заданного итеративного объекта (список, кортеж и т. Д. c.)

Это просто! Итак, первый параметр - это функция, которую вы хотите применить, а второй - ваша итерация.

Функция, которую я применил на карте, выглядит следующим образом:

''.join

Таким образом вы устанавливаете ' 'в качестве вашего разделителя (в основном, без разделителя) и объедините каждый символ с помощью .join.

Зачем вам нужно объединять символы? Что ж, у вас будет список (на самом деле их много), и вам нужна строка, поэтому вам лучше объединить эти символы в каждом списке.

А теперь самое сложное, итерация внутри map:

itertools.product(*((char.upper(), char.lower()) for char in string)

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

Теперь, когда вы это знаете, давайте погрузимся в код. Ваши (A, B) для itertools.product (A, B) теперь (char.upper (), char.lower ()). Это обе версии char, в верхнем и нижнем регистре. А что такое char? Это вспомогательная переменная, которая будет принимать значение каждого символа в данной строке, по одному.

Поэтому для ввода 'ab c' char будет принимать значения a, b и c в то время как в l oop, но поскольку вы запрашиваете все возможные комбинации прописных и строчных char, вы получите именно то, что просили.

Надеюсь, я все прояснил . :)

Дайте мне знать, если вам нужны дополнительные пояснения в комментариях. Вот рабочая функция, основанная на моем предыдущем объяснении:

import itertools

def func():
    string = input("Introduce some characters: ")
    output = map(''.join, itertools.product(*((char.upper(), char.lower()) for char in string)))
    print(list(output))

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

...