我正准备为面试做准备,想为字典中每个字母的计数制作字典。
我很惊讶地发现自己可能有一个范围界定问题,或者看起来像一个问题。
对于下面的特定方法,我不确定为什么它不起作用,直到我发现在while循环中将elem设置为空。但是由于它嵌套在引用elem的for循环中,所以我不确定为什么会这样。
s = 'letters and stuff'
def d_count(s):
dic = {}
i = 0
s1 = set(s)
s2 = list(s)
for elem in s1:
dic[elem] = 0
j = 0
while (i < len(s2)):
#elem disappears here
if s2[i] == elem:
j = j+1
dic[elem] = j
i = i + 1
return dic
print(d_count(s))
结果
{' ': 2, 's': 0, 'n': 0, 'u': 0, 'l': 0, 'f': 0, 'd': 0, 't': 0, 'r': 0, 'a': 0, 'e': 0}
所需结果
{' ': 2, 's': 2, 'n': 1, 'u': 1, 'l': 1, 'f': 2, 'd': 1, 't': 3, 'r': 1, 'a': 1, 'e': 2}
最佳答案
代码的问题是,您需要在for循环中将i
重置为零:
def d_count(s):
dic = {}
s1 = set(s)
s2 = list(s)
for elem in s1:
i = j = dic[elem] = 0
while (i < len(s2)):
if s2[i] == elem:
j += 1
dic[elem] = j
i += 1
return dic
>>> print(d_count(s))
{' ': 2, 'r': 1, 'f': 2, 't': 3, 's': 2, 'a': 1, 'n': 1, 'd': 1, 'l': 1, 'e': 2, 'u': 1}
请注意,即使使用此修复程序,您的解决方案仍然是
O(n**2)
,因为您需要对列表中的每个字符进行完整浏览。仅在一次采访中使用
Counter
即可表明您知道可以使用它。面试官会期待一种不同的方法。这是O(n)
这样的一种方法。def d_count(s):
d = {}
for char in s:
d[char] = d.get(char, 0) + 1
return d
>>> print(d_count(s))
{'l': 1, 'e': 2, 't': 3, 'r': 1, 's': 2, ' ': 2, 'a': 1, 'n': 1, 'd': 1, 'u': 1, 'f': 2}
这是使用也是
defaultdict
的O(n)
的替代方法。from collections import defaultdict
def d_count(s):
dd = defaultdict(int)
for char in s:
dd[char] += 1
return dict(dd)
>>> print(d_count(s))
{'l': 1, 'e': 2, 't': 3, 'r': 1, 's': 2, ' ': 2, 'a': 1, 'n': 1, 'd': 1, 'u': 1, 'f': 2}
关于python - 为什么在while循环中将字典值设置为零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59298497/