简体   繁体   English

为什么我的代码会针对此问题返回错误?

[英]Why is my code returning an error for this problem?

So I wrote this code that takes in a file, filename: str and returns the number of times each letter exists in the string in the form of '+'.. here is my code所以我写了这段代码,它接受一个文件, filename: str ,并以“+”的形式返回每个字母在字符串中存在的次数。这是我的代码

def letterhelper(filename):
    r = list(filename)
    c_r = set(r)
    c_r.remove(' ')
    c_r.remove(',')
    c_r.remove('.')
    c_r.remove('\n')
    f = []
    for x in c_r:
        f.append([-r.count(x), x])
    return f
def charHistogram(data: str):
    r = open(filename)
    q = r.read()
    g = letterhelper(str.lower(q))
    for t in sorted(g):
        print(t[1], (-t[0]) * '+')

and data is a separate file which will be opened by function letterhelper()数据是一个单独的文件,将由 function letterhelper letterhelper()打开

A sample input that data may contain is...数据可能包含的样本输入是......

"My Brothers and Sisters give me stress" “我的兄弟姐妹给我压力”

So the issue is, when data is所以问题是,当data

Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Praesent ac sem lorem. Integer elementum
ultrices purus, sit amet malesuada tortor
pharetra ac. Vestibulum sapien nibh, dapibus
nec bibendum sit amet, sodales id justo.

the function correctly returns function 正确返回

e ++++++++++++++++++++++++
t ++++++++++++++++++
s +++++++++++++++++
i ++++++++++++++++
a +++++++++++++++
m ++++++++++++
r ++++++++++++
u ++++++++++++
l +++++++++
n +++++++++
o +++++++++
c +++++++
d +++++++
p +++++++
b +++++
g ++
h ++
j +
v +
None

but if data = Someday Imma be greater than the rest但如果data = Someday Imma be greater than the rest

the output is output 是

c_r.remove(',')
KeyError: ','

What changes should I make so that my code correctly returns a histogram like when data is "Lorem ipsum....." for all string inputs provided??我应该进行哪些更改,以便我的代码正确返回直方图,例如当data为“Lorem ipsum .....”时提供的所有字符串输入?

Easy:简单的:

if ',' in c_r:
    c_r.remove(',')

That should be an efficient operation.这应该是一个有效的操作。

The following would solve the problem and make is easier for you to add more characters for removal in future.以下将解决问题,并使您更容易添加更多字符以供将来删除。

def letterhelper(filename):
    r = list(filename)
    c_r = set(r)
    chars_to_remove = (' ', ',', '.', '\n')
    for char in chars_to_remove:
        if char in c_r:
            c_r.remove(char)
    f = []
    for x in c_r:
        f.append([-r.count(x), x])
    return f

. .

.
.
.
.
.

In case you want suggestions on your code.如果您想对您的代码提出建议。

def letterhelper(filename):  # I GUESS you wanted the parameter here to be 'data' and not 'filename'
    r = list(filename)  # You don't need to convert str to list for using 'count' method
    c_r = set(r)
    chars_to_remove = (' ', ',', '.', '\n')
    for char in chars_to_remove:
        if char in c_r:
            c_r.remove(char)
    f = []  # You can use list comprehentions
    for x in c_r:
        f.append([-r.count(x), x])  # you don't need to negate the count here, you can reverse the sorted list in the function 'charHistogram'
    return f
def charHistogram(data: str):  # I GUESS you wanted the parameter here to be 'filename' and not 'data'
    r = open(filename)  # It is always a good practice to close the file as soon as you are done with it
    q = r.read()
    g = letterhelper(str.lower(q))
    for t in sorted(g):  # sorted(g, reverse=True)
        print(t[1], (-t[0]) * '+')  # t[0] * '+'

The following is what I could come up with.以下是我能想到的。

def letterhelper(data: str):
    chars_to_remove = (" ", ",", ".", "\n")

    # f = []
    # for x in set(data):
    #     if x not in chars_to_remove:
    #         f.append((data.count(x), x))

    # The list comprehention in the next line does exactly the same thing as the for loop above

    f = [(data.count(x), x) for x in set(data) if x not in chars_to_remove]

    return f


def charHistogram(filename: str):
    # r = open(filename)
    # q = r.read()
    # r.close()

    # The with statement in the next line does exactly the same thing as the 3 lines above

    with open(filename) as r:
        q = r.read()

    g = letterhelper(str.lower(q))  # q.lower() will also work
    for t in sorted(g, reverse=True):  # this will sort the list in descending order
        print(t[1], t[0] * "+")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM