你好,我是python初学者。我正在构建一个小程序,可以找到任何重复字符的字符串。然而,有些事我不明白。
代码:
def is_isogram(string):
dict = {}
for letter in string:
dict[letter] = 1
if letter in dict:
dict[letter] += 1
return dict
print(is_isogram("Dermatoglyphics"))
输出{"D":1、"e":1、"r":1、"m":1、"一个":1、"t":1、"o":1、"g":1、"l":1、"y":1、"p":1、"h":1、"我":1、"c":1,"s":2}
我设置了一个空字典。然后,我使用for循环遍历字符串,然后在每次迭代中,它应该将1赋值给字典键& & ">
然后使用"if…in"检查字母是否已经出现,如果已经出现,则显示"字母"。
我在一个单词Dermatoglyphics上尝试了它,但每次最后一个键值对总是2,即使这个单词只包含1个字母。有人知道为什么吗?
if
语句在完成for
循环后应用,因此它只在最后一个字符上加1。这是缩进的问题。即使你在循环内写if条件,它也不会正确,因为你的逻辑。为每个字母分配dict[letter] = 1
。然后检查if letter in dict
,使其两次加1。使用else条件代替。
def is_isogram(string):
dict = {}
for letter in string:
if letter in dict:
dict[letter] += 1
else:
dict[letter] = 1
return dict
print(is_isogram("Dermatoglyphics"))
或者你可以像这样使用count
函数
def is_isogram(string):
dict = {}
for letter in string:
dict[letter] = string.count(letter)
return dict
print(is_isogram("Dermatoglyphics"))
为每个字母设置1,然后增加最后一个字母。我想你的意思是把if
放在for
块里。
下面是一个工作版本:
def is_isogram(string):
dct = {}
for letter in string:
if letter in dct:
dct[letter] += 1
else:
dct[letter] = 1
return dct
print(is_isogram("Dermatoglyphics"))
背后的逻辑:如果字母已经存在,则增加计数器。否则用counter=1初始化。
编辑:将dict
更改为dct
,因为dict
是python内置名称,如@Michael建议的。
由于您的函数命名为is_isogram()
,它应该返回一个布尔值。这个弦要么是等值线,要么不是。一个很大的好处是,一旦发现重复项,就会停止迭代。
你不需要使用dict
。这并不是一个坏主意,但是要检测等值图,你不需要计算每个字母出现的次数。你只需要测试一下会员资格。set
更合适。像字典一样,但是没有值。
def is_isogram(word: str) -> bool:
used_letters = set()
for letter in word:
if letter in used_letters:
return False
else:
used_letters.add(letter)
return True
is_isogram("Dermatoglyphics") # True
is_isogram("DDermatoglyphics") # False
您的代码完全按照预期工作,它为每个字母分配1,然后由于您的if条件不在循环中,它将最后一个字符(字母)加1。
我对你的代码做了一些修改。
def is_isogram(string):
dict = {}
for letter in string:
dict[letter] = 0
for letter in string:
dict[letter] += 1
return dict
print(is_isogram("telegram"))
我所做的是首先将所有字母添加到字典中,然后使用另一次扫描来计数每个字母。
这个函数的复杂度是O(n),我认为这比其他答案要快
这是一个定时执行
这个答案:https://onlinegdb.com/lMC-Qn76D
其他答案:https://onlinegdb.com/eeV0IFN5J
如果我说错了请纠正我