Python 3.x Python ord()和chr()
我有: 根据我的理解,这应该只输出句子中的每个字母,如:Python 3.x Python ord()和chr(),python-3.x,list,for-loop,chr,ord,Python 3.x,List,For Loop,Chr,Ord,我有: 根据我的理解,这应该只输出句子中的每个字母,如: 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) 对于字符串“aB)a2a2a2”),输出是正确的: )) 111 3333 etc. 对于字符串
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)
对于字符串“aB)a2a2a2”),输出是正确的:
))
111
3333
etc.
对于字符串“aB)A2A2”,输出错误:
))
222
B
aaaa
我觉得我的所有基础都被覆盖了,但我不确定这段代码有什么问题。当您执行
list.index(x)
时,您正在列表中搜索出现值的第一个索引。但这并不是您真正想要的,您想要的是刚刚读取的值的特定索引,即使相同的值也出现在列表的前面
从序列中沿边值获取索引的最佳方法是使用enuemerate
:
)
222
)
aaaa
这将使您获得所需的输出,但是还有其他一些事情可以使您的代码更易于阅读和理解。首先,使用list
作为变量名是一个非常糟糕的主意,因为这将在命名空间中隐藏内置list
类型的名称。这使得任何阅读您的代码的人都感到非常困惑,如果您想出于某种目的而使用普通的列表
,并且不记得您已经将其用于自己的变量,那么您甚至会感到困惑
另一个问题也是关于变量名的,但它有点微妙。您的两个循环都使用名为x
的循环变量,但每次值的含义都不同。第一个循环覆盖输入字符串中的字符,而后一个循环覆盖每个字符的计数。使用有意义的变量会使事情变得更清楚
以下是我建议的所有修复方案的组合:
for i, x in enumerate(list):
if x >= 1:
print(chr(i) * x)
因此,请解释您的代码有何错误输入“aB)a2a2a2”的输出错误,它甚至不计算字母B。不要使用
list
作为变量名称,因为它是内置的名称。在任何情况下,list.index(x)
没有真正意义。在上下文中,x
是一个整数,该整数可以出现在列表中的多个位置。在许多情况下,索引(x)
不会返回实际需要的索引。请改用枚举
。首先,不要给变量命名列表
,它与内置类型同名,可能会以奇怪的方式把事情搞得一团糟。我经常使用变量名ch
,而不是完全拼写字符
,因为这样更容易理解输入和读取-但它的符号性足以让人理解这一点。@MarkRansom:是的,当然没有必要像我在这里所做的那样使用完整的单词,但有时行很短,每个变量的用法也很少,所以不会造成伤害!即使是单字母变量,如果它们有明确的语义,有时也可以(如x
和y
作为坐标,或i
和j
作为索引)。
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)