用Python字典计算问题

时间:2018-09-25 16:09:40

标签: python dictionary counting

因此,我试图在此函数中计算唯一字母。如果它们是唯一字母,则不返回False,则返回True。用“编程”一词 有两个r和两个m和两个g。如果实际答案为False,则返回True。我的逻辑错了吗?

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 :(得分:1)

根据您的算法,您只是在检查字符串的第一个字符。而不是整个字符串。

此代码块具有错误逻辑:

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实现。

快乐编码! :)

答案 1 :(得分:1)

如果您要检查是否所有字母都只出现一次,请使用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)) 进行计数:

$reduce

答案 2 :(得分:0)

当遇到第一个唯一字符时,您在循环中返回得太早了。您只知道循环结束时所有内容都是唯一的:

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.Counterall缩短整个功能,但要维护底层算法:

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))

答案 3 :(得分:0)

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

    else:
        return True

这是您的问题。这将检查unique_chars中的任何值是否大于1,或者 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

答案 4 :(得分:0)

s = 'Programming'

a = [True for i in s if s.count(i) > 1]
if any(a):
    print(False)
else:
    print(True)