如何解决为什么我的代码删除了我的替换代码中的999?
我有以下代码,将所有标点符号替换为999,并将所有字母字符替换为其数字位置。我已经包含了确认已替换标点符号的打印语句。但是我似乎用剩下的代码替代了其他字符。
import string
def encode(text):
punct = '''!()-[]{};:'"\,<>./?@#$%^&*_~'''
for x in text.lower():
if x in punct:
text = text.replace(x,".999")
print(text)
nums = [str(ord(x) - 96)
for x in text.lower()
if x >= 'a' and x <= 'z'
]
return ".".join(nums)
print(encode(str(input("Enter Text: "))))
输入:'Morning! \n'
输出:'13.15.18.14.9.14.7 \n'
预期输出:13.15.18.14.9.14.7.999
解决方法
不,您在这里有两个独立的逻辑“故事”。一个用999
代替标点符号。另一个过滤掉所有字母,并建立一个独立的字母位置列表。
nums = [str(ord(x) - 96)
for x in text.lower()
if x >= 'a' and x <= 'z'
]
return ".".join(nums)
请注意,此操作不会更改text
,并且仅接收text
中的字母。如果要包括数字,请这样做:
nums = [str(ord(x) - 96)
if x >= 'a' and x <= 'z'
else x
for x in text.lower()
]
return ".".join(nums)
print(encode("[hello]"))
的输出:
..9.9.9.8.5.12.12.15...9.9.9
,
nums = [str(ord(x) - 96)
for x in text.lower()
if x >= 'a' and x <= 'z'
]
这意味着:从字符串的小写版本中提取每个字符,并且仅在介于'a'
和'z'
之间的情况下,转换值并将结果放入nums
。
第一步,将一堆标点符号替换为包含'.'
和'9'
字符的文本。但是'9'
和'.'
都不在'a'
和'z'
之间,因此,第二步当然都不保留。
现在,我了解您要做什么:从根本上来说,解决问题的方法是错误的。您想将规则的两部分分开,以“编码”输入的给定部分。但是,您要做的是将用于对单个元素进行编码的整个规则和将单个元素规则应用于整个输入的过程分开。毕竟-这就是列表理解要做的。
这是关注点分离的概念。这两个业务规则是同一个问题的一部分-因为实施一条规则并不能帮助您实施另一条。但是,能够编码一个输入字符的 可以帮助您对整个字符串进行编码,因为有一种工具可以精确完成这项工作。
对于单个字符,我们可以有一个复杂的规则-没问题。只需将其放在单独的函数中,这样我们就可以给它起一个有意义的名称,并使事情易于理解。从概念上讲,我们的单个字符编码是一个数字值,因此我们将一致地将其编码为数字,然后让字符串编码过程进行转换。
def encode_char(c):
if c in '''!()-[]{};:'"\,<>./?@#$%^&*_~''':
return 999
if 'a' <= c.lower() <= 'z':
return ord(c) - 96
# You should think about what to do in other cases!
# In particular,you don't want digit symbols 1 through 9 to be
# confused with letters A through I.
# So I leave the rest up to you,depending on your requirements.
现在,我们可以应用整个编码过程:我们需要一个将'.'
放在值的字符串表示形式之间的字符串。很简单:
def encode(text):
return '.'.join(str(encode_char(c)) for c in text)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。