在不使用字典或list.count()的情况下,如何计算字符串中出现的字母数?

2024-10-03 06:20:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图不使用count()count()来计算每个字母 dict()

我确实写了一些东西,但我的代码仍然有问题

myString = []
#countList = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
myString ="pynativepynvepynative"
countList = [len(myString)+1]
for i in range(len(myString)):
        #print("Here 0")
        for j in range(len(countList)):
            #print("Here 1")
            if i == countList[j]:
                #print("Here 1.1")
                countList[j+1] = (countList[j+1] + 1)
                break
            else:
                #print("Here 2")
                countList.append(myString[i])
                countList.append(1)
                break
print(countList)

预期产出:

['p', 3, 'y', 3, 'n', 3, 'a', 2, 't', 2, 'i', 2, 'v', 3, 'e', 3]

实际产量:

[22, 'p', 1, 'y', 1, 'n', 1, 'a', 1, 't', 1, 'i', 1, 'v', 1, 'e', 1, 'p', 1, 'y', 1, 'n', 1, 'v', 1, 'e', 1, 'p', 1, 'y', 1, 'n', 1, 'a', 1, 't', 1, 'i', 1, 'v', 1, 'e', 1]

Tags: 代码inforlenherecount字母range
3条回答

使用dict子类^{}计算对象,这使它成为一个单行程序:

from collections import Counter
c = Counter('pynativepynvepynative')

Counter({'p': 3, 'y': 3, 'n': 3, 'v': 3, 'e': 3, 'a': 2, 't': 2, 'i': 2})

(从技术上讲,这不是dict,而是dict的一个子类。)

您可以从中获取元组列表:

>>> c.most_common()
[('p', 3), ('y', 3), ('n', 3), ('v', 3), ('e', 3), ('a', 2), ('t', 2), ('i', 2)]

列表或元组对于计数是不可取的,因为您希望能够分别按键(正在计数的对象)和值(计数)进行访问/排序。理论上,您可以在列表/元组列表上执行此操作,但这是一件痛苦的事情,Counteralrady定义了您需要的几种方法

您可以做的是从字符串中获取唯一的字母,并在字符串中为每个唯一的字母循环以计算其频率

def func_count(string):
    letter = []
    for char in string:
        if char not in letter:
            letter.append(char)
    res = []
    for let in letter:
        count = 0
        for char in string:
            if let == char:
                count+=1
        res.extend([let, count])
    # res = {a:b for a,b in zip(res[::2], res[1::2])} 
    return res

string = "pynativepynvepynative"

solution = func_count(string)
print(solution)

输出

['p', 3, 'y', 3, 'n', 3, 'a', 2, 't', 2, 'i', 2, 'v', 3, 'e', 3]  

编辑,如果需要dict格式的解决方案,请在函数中添加res = {a:b for a,b in zip(res[::2], res[1::2])}

使用我的问题代码,我能够通过修改问题代码得到正确答案

我的问题是我不知道如何正确地启动countList

countList = []
myString ="pynativepynvepynative"
for i in range(len(myString)):
        #print("Here 0")
        for j in range(len(countList)):
            #print("Here 1")
            #print(myString[i])
            #print(j)
            #print(countList[j])
            if myString[i] == countList[j]:
                #print("Here 1.1")
                #print(myString[i])
                countList[j+1] = (countList[j+1] + 1)
                break
        else :
            #print("Here 2")
            countList.append(myString[i])
            countList.append(1)
print(countList)

实际产量:

['p', 3, 'y', 3, 'n', 3, 'a', 2, 't', 2, 'i', 2, 'v', 3, 'e', 3]

相关问题 更多 >