因此,我试图在此函数中计算唯一字母。如果它们是唯一字母,则不返回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'))
答案 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.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))
答案 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)