【问题标题】:Function not returning same result on each run函数在每次运行时不返回相同的结果
【发布时间】:2013-11-03 19:43:21
【问题描述】:

我正在尝试用 HTML 实体替换特殊字符,但结果是随机输入相同的,我不明白为什么。

代码如下:

def secure(text):
    hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "&cent;", "©": "&copy;", "÷": "&divide;", ">": "&gt;", "<": "&lt;", "µ": "&micro;", "·": "&middot;", "¶": "&para;", "±": "&plusmn;", "€": "&euro;", "£": "&pound;", "®": "&reg;", "§": "&sect;", "™": "&trade;", "¥": "&yen;", "á": "&aacute;", "Á": "&Aacute;", "à": "&agrave;", "À": "&Agrave;", "â": "&acirc;", "Â": "&Acirc;", "å": "&aring;", "Å": "&Aring;", "ã": "&atilde;", "Ã": "&Atilde;", "ä": "&auml;", "Ä": "&Auml;", "æ": "&aelig;", "Æ": "&AElig;", "ç": "&ccedil;", "Ç": "&Ccedil;", "é": "&eacute;", "É": "&Eacute;", "è": "&egrave;", "È": "&Egrave;", "ê": "&ecirc;", "Ê": "&Ecirc;", "ë": "&euml;", "Ë": "&Euml;", "í": "&iacute;", "Í": "&Iacute;", "ì": "&igrave;", "Ì": "&Igrave;", "î": "&icirc;", "Î": "&Icirc;", "ï": "&iuml;", "Ï": "&Iuml;", "ñ": "&ntilde;", "Ñ": "&Ntilde;", "ó": "&oacute;", "Ó": "&Oacute;", "ò": "&ograve;", "Ò": "&Ograve;", "ô": "&ocirc;", "Ô": "&Ocirc;", "ø": "&oslash;", "Ø": "&Oslash;", "õ": "&otilde;", "Õ": "&Otilde;", "ö": "&ouml;", "Ö": "&Ouml;", "ß": "&szlig;", "ú": "&uacute;", "Ú": "&Uacute;", "ù": "&ugrave;", "Ù": "&Ugrave;", "û": "&ucirc;", "Û": "&Ucirc;", "ü": "&uuml;", "Ü": "&Uuml;", "ÿ": "&yuml;", "\\":"\\\\"};
    for i, j in hsconvert.items():
        text = text.replace(i, j)
        return text

print(secure("La Vie d'Adèle, chapitres 1 & 2"))

以下是控制台输出:

>>> ================================ RESTART ================================
>>> 
La Vie d\'Ad&egrave;le, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']
>>> ================================ RESTART ================================
>>> 
La Vie d\\'Ad&egrave;le, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']

问题出在' 字符上,该字符有时返回为\',有时返回为\\'

我认为它来自字典中的最后一项,"\\":"\\\\",但我不明白为什么每次运行时它的解释都不一样。

【问题讨论】:

    标签: python string python-3.x


    【解决方案1】:

    正如您在回答中推测的那样,问题在于字典上的迭代没有定义的顺序。

    来自Python 3 documentation

    对字典执行 list(d.keys()) 会返回一个包含所有 字典中使用的键,以任意顺序(如果你想要的话 已排序,只需使用 sorted(d.keys()) 代替)。

    没有明确说明,但同样适用于 items()。

    在这种情况下看到迭代之间的顺序发生变化我有点惊讶,但在这种情况下任意意味着未定义——任何顺序在技术上都是有效的。如果您想要一致的结果,我建议您重新设计您的算法,使其对项目的顺序完全不敏感;如果做不到这一点,首先对输出进行排序或使用 OrderedDict 至少可以解决一致性问题。

    【讨论】:

      【解决方案2】:

      我已将功能修改如下,它正在工作:

      def secure(text):
          text.replace("\\", "\\\\")
          hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "&cent;", "©": "&copy;", "÷": "&divide;", ">": "&gt;", "<": "&lt;", "µ": "&micro;", "·": "&middot;", "¶": "&para;", "±": "&plusmn;", "€": "&euro;", "£": "&pound;", "®": "&reg;", "§": "&sect;", "™": "&trade;", "¥": "&yen;", "á": "&aacute;", "Á": "&Aacute;", "à": "&agrave;", "À": "&Agrave;", "â": "&acirc;", "Â": "&Acirc;", "å": "&aring;", "Å": "&Aring;", "ã": "&atilde;", "Ã": "&Atilde;", "ä": "&auml;", "Ä": "&Auml;", "æ": "&aelig;", "Æ": "&AElig;", "ç": "&ccedil;", "Ç": "&Ccedil;", "é": "&eacute;", "É": "&Eacute;", "è": "&egrave;", "È": "&Egrave;", "ê": "&ecirc;", "Ê": "&Ecirc;", "ë": "&euml;", "Ë": "&Euml;", "í": "&iacute;", "Í": "&Iacute;", "ì": "&igrave;", "Ì": "&Igrave;", "î": "&icirc;", "Î": "&Icirc;", "ï": "&iuml;", "Ï": "&Iuml;", "ñ": "&ntilde;", "Ñ": "&Ntilde;", "ó": "&oacute;", "Ó": "&Oacute;", "ò": "&ograve;", "Ò": "&Ograve;", "ô": "&ocirc;", "Ô": "&Ocirc;", "ø": "&oslash;", "Ø": "&Oslash;", "õ": "&otilde;", "Õ": "&Otilde;", "ö": "&ouml;", "Ö": "&Ouml;", "ß": "&szlig;", "ú": "&uacute;", "Ú": "&Uacute;", "ù": "&ugrave;", "Ù": "&Ugrave;", "û": "&ucirc;", "Û": "&Ucirc;", "ü": "&uuml;", "Ü": "&Uuml;", "ÿ": "&yuml;"};
          for i, j in hsconvert.items():
              text = text.replace(i, j)
          return text
      

      但我不明白为什么旧功能不起作用... A for x in ... 并不总是相同的顺序?

      【讨论】:

      • 也许您可以让确切地更清楚您的修改是什么以及为什么您认为它可以解决问题,即使您不知道是什么导致旧的失败?附:字典没有顺序,这意味着替换以随机顺序进行评估...
      • 我认为您刚刚回答了问题...我认为 for 已订购,但似乎已订购,因此如果首先更换是在前两个之后完成的,结果会有所不同!!!跨度>
      • for 已订购。不是字典(正如我在回答中解释的那样!)
      • 是的,我知道它解决了 @user1998000 的“问题”,但我没有精力为它写一个好的答案,所以让其他有更多 Python 经验的人更容易:-)。
      【解决方案3】:

      有时,您的代码首先将\\ 替换为\\\\,然后将\' 替换为\\'。有时它会反过来。

      示例(使用“\'”作为输入):

      如果我们先执行\\ -> \\\\,然后是\' -> \\',我们会在第一次尝试替换后得到\'(没有任何反应,因为没有\\) ,然后在第二个之后\\'

      但是如果我们反过来做,我们在第一个之后得到\\',然后它用\\\\替换第二个\\,所以我们最终得到\\\\'

      发生这种情况是因为 hsconvert 是一个字典,所以它没有排序,并且遍历它(for 循环)不一定每次都以相同的方式发生。

      你解决它的方法很好,但为了将来参考,collections 模块中有一个OrderedDict

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多