我有:
txt = input('What is your sentence? ')
list = [0]*128
for x in txt:
list[ord(x)] += 1
for x in list:
if x >= 1:
print(chr(list.index(x)) * x)根据我的理解,这应该输出句子中的每个字母,如下所示:
))
111
3333
etc.对于字符串"aB)a2a2a2)“,输出是正确的:
))
222
B
aaaa对于字符串"aB)a2a2a2“,输出是错误的:
)
222
)
aaaa我觉得我所有的基础都被覆盖了,但我不确定这段代码到底出了什么问题。
发布于 2021-04-02 08:44:12
在执行list.index(x)时,您将在列表中搜索该值出现的第一个索引。但这实际上并不是您想要的,您想要的是您刚刚读取的值的特定索引,即使相同的值也出现在列表中较早的其他位置。
从序列中获取索引和边值的最佳方法是使用enuemerate
for i, x in enumerate(list):
if x >= 1:
print(chr(i) * x)这应该会得到您想要的输出,但是还有其他几件事可以使您的代码更容易阅读和理解。首先,使用list作为变量名是一个非常糟糕的主意,因为这将在您的名称空间中隐藏内置list类型的名称。这使得任何阅读您的代码的人都非常困惑,如果您想要将普通的list用于某些目的而忘记已经将其用于您自己的变量,您甚至会感到困惑。
另一个问题也是关于变量名的,但它有点微妙。您的两个循环都使用了一个名为x的循环变量,但每次值的含义都不同。第一个循环遍历输入字符串中的字符,而第二个循环遍历每个字符的计数。使用有意义的变量会让事情变得更清晰。
以下是我建议的所有修复方法的组合:
text = input('What is your sentence? ')
counts = [0]*128
for character in text:
counts[ord(character)] += 1
for index, count in enumerate(counts):
if count >= 1:
print(chr(index) * count)https://stackoverflow.com/questions/66882427
复制相似问题