Найти самые уникальные символы в списке строк - PullRequest
2 голосов
/ 26 февраля 2020

Недавно вступил в клуб кодов python, поэтому не является школьным заданием.

Задание:

Напишите функцию coolest_word(words), которая возвращает самое крутое слово, если оно существует.

Прохлада определяется количеством уникальных символов в слове.

Например, слово "decomposition" содержит 10 уникальных букв. Ваша задача - найти из заданного списка слов самое крутое слово и вернуть его.

Если список пуст, вернуть None. Если есть ie, верните одно из слов.

Мое решение до сих пор:

words = ['expectation', 'discomfort', 'half', 'decomposition']
def coolest_word(words):
    length = 0
    unique = ['']
    for i in words:
        if (len(words) != 0 and len(set(i)) > length):
            length = len(set(i))
            unique[0] = i
        else:
            unique[0] = ('None')
    return(unique)  
print(coolest_word(words))

Я решил изменить list на set и затем сравнивайте уникальные символы set друг с другом. Поскольку set не учитывает повторяющиеся переменные, это кажется хорошей идеей.

Всякий раз, когда для l oop находит более длинный набор (с большим количеством переменных), он перезаписывается в уникальный набор для запоминания и последующего вызова.

В настоящий момент проблема заключается в том, что если заданный список пустых уникальных возвратов [''], чего я не понимаю почему.

Как и во второй части, если список пуст, я хочу, чтобы уникальный был перезаписан, но это не так.

Есть мысли?

Ответы [ 4 ]

5 голосов
/ 26 февраля 2020

Простое применение max с key и default.

def coolest_word(words):
    return max(words, key=lambda w: len(set(w)), default=None)

Демо:

>>> coolest_word(['expectation', 'discomfort', 'half', 'decomposition'])
'decomposition'

>>> [coolest_word([])]   # Wrap in a list because None by itself doesn't get printed
[None]
2 голосов
/ 26 февраля 2020

Вы можете использовать set для получения уникальных элементов в слове и len для определения количества уникальных элементов в слове.

words = ['expectation', 'discomfort', 'half', 'decomposition']

def coolest_word(wlist):
    k = {i:len(set(i)) for i in wlist}
    return max(k, key=k.get)

print(coolest_word(words))

Вывод:

'decomposition'

Пояснение

если вы сделаете print(k), это даст вам

{'expectation': 9, 'discomfort': 9, 'half': 4, 'decomposition': 10}

max(k, key=k.get) вернет ключ с наибольшим значением (максимальное значение),

k.get получит значения для ключа

например.

print(k.get("half"))

вывод:

4
1 голос
/ 26 февраля 2020

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

unique = ['None']

Также вы должны удалить ветку else внутри for для l oop, потому что это перезапишет результат, как только вы найдете слово, не содержащее повторяющихся букв (чтобы проверить, что я говорю, попробуйте перетасовать список ввода следующим образом:

words = ['expectation', 'discomfort', 'decomposition', 'half']

, и вы получите «Нет» вместо «декомпозиция».

ADDENDUM: вы даже можете упростить условие if, заменив

if (len(words) != 0 and len(set(i)) > length)

на

if (len(set(i)) > length)

, потому что если бы len(words) было на самом деле 0, вы бы даже не ввели для л * * тысяча двадцать два.

1 голос
/ 26 февраля 2020

Если ваш входной список words пуст, то есть, words=[], вы не будете go внутри для l oop. И вы не определяете, что должно произойти с unique, если список ввода пуст.

Попробуйте это:

words = ['expectation', 'discomfort', 'half', 'decomposition']
def coolest_word(words):
    length = 0
    unique = ['']

    if not words:    # If input list is empty set unique as None.
        unique[0] = 'None'    

    for i in words:
        if (len(words) != 0 and len(set(i)) > length):
            length = len(set(i))
            unique[0] = i
        else:
            unique[0] = ('None')
    return(unique)  
print(coolest_word(words))

Но лучший способ, который я могу предложить, - инициализировать список unique с помощью None, то есть unique = ['None'] вместо unique = ['']. Таким образом, вы можете сохранить весь свой код как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...