Рубрики
Без рубрики

Как они сделали все это в одной линии? Решение для ката: удалить дублирующие слова

Я снова был в этом: Решение «Кодецваров» Ката, затем удивляясь однострочным решениям, проголосовавшим лучшим PRAC … Tagged with Python, начинающие.

Я снова был в этом: решение Codewars Kata, затем удивляясь однострочным решениям, проголосовавшим передовую практику сообществом Codewars.

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

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

def remove_duplicate_words(s):
    """ removes duplicate words from a string

    s:   a string of words separated by spaces
    """
    s = s.split()
    unique = []
    for word in s:
        if word not in unique:
            unique.append(word)
    s = ' '.join(unique)


    return s

А вот один лидер:

def remove_duplicate_words(s):
    return ' '.join(dict.fromkeys(s.split()))

Примечание: я имею в виду одну линию функционального тела.

Это довольно плотно, поэтому я собираюсь сломать его. Мне нравится начинать изнутри.

s.split()

Обратите внимание, что S – входная строка. Это выражение возвращает список слов в строке. По умолчанию метод .split расщепляет строку на космических символах и выбрасывает пространства.

На следующий шаг

dict.fromkeys(s.split())

Этот шаг интересен. Это создает словарь (подробнее о том, почему словарь позже) с ключами для словаря, предоставленного словами в списке слов.

Но чего -то не хватает. Разве словари в Python должны были иметь ключи и ценности? Оказывается, что когда вы используете DICT.Fromkeys, чтобы сформировать словарь без значений в аргументе, он просто не вводит ни одного для каждого значения.

Чтобы уточнить это, вот как это выглядит, если вы печатаете этот дикт, образованный таким образом из входной строки. Вот словарь: {‘alpha’: Нет, «Бета»: Нет, «Гамма»: Нет, «Дельта»: Никто}

Мы почти там.

' '.join(dict.fromkeys(s.split()))

Обратите внимание на синтаксис здесь. Это вызывает метод .join на строке с одним пространством. Поскольку аргумент является словарем, он выведет строку А со словами, взятыми из клавиш, разделенных пространствами. (Примечание: я не уверен, почему он игнорирует значения. Я проверил, и это делает это, даже если есть значение (например, 4) для одного из ключей).

Все, что осталось, – это вернуть значение этого выражения. Обратите внимание, что, хотя это может показаться более интуитивным для того, чтобы сделать что -то вроде этого:

output = ' '.join(dict.fromkeys(s.split()))
return output

Это совершенно законно делать это в одной линии, поставив выражение непосредственно после возвращения, как в решении One Line:

return ' '.join(dict.fromkeys(s.split()))

И вот это.

Дальнейшее примечание: вы можете задаться вопросом: зачем беспокоиться о дикте с пустыми ключами? Почему бы просто не использовать набор. Чтобы понять это, вам нужно понять две вещи. Первый: Хотя в описании это явно указывает на это, в примере ясно показывает, что слова в выводимой строке должны быть в порядке их первого появления в входной строке. Во -вторых: наборы неупорядочены, но, как и Python 3.6, и продолжение Python 3.7, словарры упорядочены в соответствии с приказом вставки. Так что теперь должно быть ясно, почему словарь был правильным выбором, хотя набор казался бы более очевидным ответом. (И, со строгим прочтением описания задачи, вы можете утверждать, что это будет правильным решением, но автоматические функции тестирования на ходаторах просят не согласиться.)

Итак, у вас есть это: одна линия, чтобы сделать то, что у меня было шесть. Хотя у моей функции было больше документации, поэтому я даю себе очки там.

Кстати, код и копия этого описания находятся на моем репо Здесь Анкет

Я с нетерпением жду возможности показать вам следующий!

Оригинал: “https://dev.to/ekand/how-did-they-do-all-that-in-one-line-a-solution-for-the-kata-remove-duplicate-words-28n1”