函数不会在每次运行时返回相同的结果

时间:2013-11-03 19:43:22

标签: python string python-3.x

我正在尝试用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']

问题在于'字符,有时会返回\',有时会返回\\'

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

3 个答案:

答案 0 :(得分:3)

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

来自Python 3 documentation

  

在字典上执行列表(d.keys())会返回所有列表   字典中使用的键,以任意顺序(如果你想要它)   排序后,只需使用sorted(d.keys())代替。

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

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

答案 1 :(得分:0)

我修改了以下功能,它正在运行:

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

但是我不明白为什么旧功能不能正常工作......对于x in ...并不总是相同的顺序?

答案 2 :(得分:0)

有时,您的代码首先用\\替换\\\\,然后用\'替换\\'。有时它反过来会这样做。

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

如果我们\\ - &gt;先\\\\,然后\' - &gt; \\'我们在第一次尝试替换后获得\'(因为没有\\没有任何反应),然后在第二次尝试之后获得\\'

但是如果我们反过来这样做,我们会在第一个之后得到\\',然后用第\\替换\\\\,所以我们最终得到{ {1}}!

这是因为\\\\'是一个字典,所以它不是有序的,并且迭代它(hsconvert循环)不一定每次都以相同的方式发生。

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