Подсчет выпусков со словарями Python - PullRequest
0 голосов
/ 25 сентября 2018

Итак, я пытаюсь посчитать уникальную букву в этой функции.Если они являются уникальными буквами, верните True, если нет, верните False.В слове «Программирование» есть две буквы «r», «две буквы» и «две буквы».Его возвращение Верно, где фактический ответ - Ложь?Моя логика здесь неверна?

def unique_chars_in_string(input_string):
    unique_chars = {}
    if input_string == "":
        return True

    for letter in input_string:
        if letter in unique_chars:
            unique_chars[letter]+=1
        else:
             unique_chars[letter]=1


    for k in unique_chars:
        if unique_chars[k] > 1:
            return False

        else:
            return True


print(unique_chars_in_string('Programming'))

Ответы [ 5 ]

0 голосов
/ 25 сентября 2018
s = 'Programming'

a = [True for i in s if s.count(i) > 1]
if any(a):
    print(False)
else:
    print(True)
0 голосов
/ 25 сентября 2018

, если вы хотите проверить, встречаются ли все буквы только один раз, используйте all

return all(k == 1 for k in unique_chars.values())

, что позволит избежать слишком быстрого возврата результата, если вы не отсканировали остальные буквы.

Также рассмотрите возможность подсчета ваших писем с помощью collections.Counter, который является специализированным словарем, созданным для подсчета хэшируемых элементов:

unique_chars = collections.Counter(input_string)

, поэтому объединение в одну строку:

return all(k == 1 for k in collections.Counter(input_string).values())

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

return len(input_string) == len(set(input_string))
0 голосов
/ 25 сентября 2018
for k in unique_chars:
    if unique_chars[k] > 1:
        return False

    else:
        return True

Это ваша проблема.Это проверяет, является ли любое значение в unique_chars больше единицы, или , если значение first равно единице или меньше.Вместо этого вы должны сделать:

for k in unique_chars:
    if unique_chars[k] > 1:
        return False
return True  # since this is after the for loop, it only runs if
             # no character has a count greater than one.

В качестве альтернативы это можно сделать более эффективным с помощью set.

seen = set()
for c in input_string:
    if c in seen:
        return False
    seen.add(c)
return True
0 голосов
/ 25 сентября 2018

Согласно вашему алгоритму, вы просто проверяете первый символ строки.И не вся строка.

Этот блок кода имеет логику erroneus:

for k in unique_chars:
    if unique_chars[k] > 1:
        return False

    else:
        return True

Вам не нужно другое условие внутри цикла for.

Попробуйте вместо этого:

def unique_chars_in_string(input_string):
    unique_chars = {}
    if input_string == "":
        return True

    for letter in input_string:
        if letter in unique_chars:
            unique_chars[letter]+=1
        else:
             unique_chars[letter]=1


    for k in unique_chars:
        if unique_chars[k] > 1:
            return False

    return True


print(unique_chars_in_string('Programming'))

Итак, если какой-либо символ имеет число, превышающее 1, ваш код вернет false, иначе он вернет true.

Кроме того, отметьте Jean-François Fabre's answer для этой проблемы, это короткая и приятная реализация Pythonic.

Happy Coding!:)

0 голосов
/ 25 сентября 2018

Вы возвращаетесь слишком рано в цикле, когда сталкиваетесь с первым уникальным персонажем.Вы только знаете, что все уникальны в конце цикла:

def unique_chars_in_string(input_string):
    unique_chars = {}
    for letter in input_string:
        if letter in unique_chars:
            unique_chars[letter]+=1
        else:
             unique_chars[letter]=1

    for k in unique_chars:
        if unique_chars[k] > 1:
            return False  # not all are unique -> return early
    # but only when all have been checked, can you know for sure all are
    return True

Вся эта функция может быть сокращена с использованием collections.Counter и all, но с сохранением основного алгоритма:

from collections import Counter

def unique_chars_in_string(input_string):
    return all(v==1 for v in Counter(input_string).values())

Или даже проще:

def unique_chars_in_string(input_string):
    return len(input_string) == len(set(input_string))
...