【问题标题】:Why does my code remove 999 in my replacement code?为什么我的代码会删除替换代码中的 999?
【发布时间】:2020-12-24 04:34:16
【问题描述】:

我有下面的代码,用 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

【问题讨论】:

  • 您能否至少给出一个实际示例来说明您的输入、接收输出和预期输出?我不知道我应该在这里寻找什么问题。
  • 例如早上!应该是 (13.15.18.14.9.14.7.999)
  • 尝试提出一个单独函数,给定一个单个字符的输入,告诉你整数值 它应该代表。然后尝试使用该单独的函数一次性创建您想要的文本。
  • 顺便说一句:您不需要import string来使用字符串方法 -​​ 但您可能应该将它用于常量字符串它提供了,例如string.punctuation等于'!"#$%&amp;\'()*+,-./:;&lt;=&gt;?@[\\]^_{|}~'. Also, input`已经返回一个字符串;在结果上使用str 没有任何作用。

标签: python for-loop encode str-replace string-substitution


【解决方案1】:
    nums = [str(ord(x) - 96) 
            for x in text.lower()
                if x >= 'a' and x <= 'z'
                ]

这意味着:从字符串的小写版本中取出每个字符,只有在'a''z' 之间,转换值并将结果放入nums

在第一步中,您将一堆标点符号替换为包含'.''9' 字符的文本。但是'9''.' 都不在'a''z' 之间,所以当然不会在第二步中保留。


现在我明白了您的目的:您从根本上解决问题的方法是错误的。您希望将规则的两半分开以“编码”输入的给定部分。但是您要做的是将用于编码单个元素整个规则将单个元素规则应用于整个输入的过程分开时间>。毕竟 - 这就是列表推导所做的

这是关注点分离的概念。这两个业务规则是同一个问题的一部分——因为实施一个规则并不能帮助您实施另一个。但是,能够对一个输入字符进行编码,确实可以帮助您对整个字符串进行编码,因为有一个工具可以完成这项工作。

我们可以为单个字符制定一个复杂的规则 - 没问题。只需把它放在一个单独的函数中,这样我们就可以给它起一个有意义的名字,让事情变得简单易懂。从概念上讲,我们的单个字符编码是一个 numeric 值,因此我们将始终编码为一个数字,然后让字符串编码过程进行转换。

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)

【讨论】:

    【解决方案2】:

    不,这里有两个独立的逻辑“故事”。一个用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      相关资源
      最近更新 更多