我正准备为面试做准备,想为字典中每个字母的计数制作字典。

我很惊讶地发现自己可能有一个范围界定问题,或者看起来像一个问题。

对于下面的特定方法,我不确定为什么它不起作用,直到我发现在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}


这是使用也是defaultdictO(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/

10-13 04:43