作为Python的初学者,我决定参加Codewars谜题。
Codewars使用Python 2.7.6。
第二个难题要求你:
编写一个函数,该函数将返回在输入字符串中出现多次不同的不区分大小写的字母字符和数字的计数。可以假定输入字符串仅包含字母(大写和小写)和数字。
例如,如果你给程序“abcde”它应该给你0,因为没有重复。但是,如果你给它“不可分割性”它应该给你2,因为有2个重复的字母:i(发生7次)和s(发生两次)。
作为初学者,我提出了一种我认为非常粗糙的方法,但它在我的系统上完美运行:
def duplicate_count(text):
# the number of duplicates
dupes = 0
# convert input string to lower case and split into individual characters
list_of_chars = list(text.lower())
# sort list into groups
sorted_chars = sorted(list_of_chars)
# get length of list
n = len(sorted_chars)
# check whether the first element of the list is the same as the second. If
# it is, add one to the dupes count
if sorted_chars[0] == sorted_chars[1]:
dupes += 1
else:
dupes += 0
# start with the second element (index: 1) and finish with the (n - 1)-th
# element
for i in range(1, n - 1):
# if the ith element of the list is the same as the next one, add one
# to the dupes count. However, since we only want to count each
# duplicate once, we must check that the ith element is not the same as
# the previous one
if sorted_chars[i] == sorted_chars[i + 1] and sorted_chars[i] != sorted_chars[i - 1]:
dupes += 1
else:
dupes += 0
return dupes
这会通过所有自动化测试,但当我将其作为解决方案提交时,我会得到一个STDERR:
Traceback:
in <module>
in duplicate_count
IndexError: list index out of range
据我了解,如果我尝试访问不存在的列表元素,则会出现此错误。但我无法看到我的代码中的哪个位置。我计算了列表的长度并将其存储在n
中。因此,假设我将字符串"ababa"
提供给duplicate_count
,它应生成长度为5的列表sorted_chars
:['a', 'a', 'a', 'b', 'b']
。因此n
= 5.因此{ {1}} = range(1, n - 1)
将生成数字1,2和3.因此,从数学上讲,range(1, 4)
对于每个i∈I= {1,2,3}。因此,我在此代码中使用的最大索引是4(for i in range(1, n - 1)
),这很好,因为索引4处有一个元素(在这种情况下为'b')。
为什么Codewars会给我这个错误。
答案 0 :(得分:1)
在这种情况下,您的功能至少需要两个字符才能工作。尝试运行duplicate_count('a')
并查看它引发的错误。在n = len(sorted_chars)
之后添加以下内容:
if n < 2:
return 0
这将停止运行函数的其余部分并返回0重复项(因为如果只有一个字符,则无法执行任何操作)。