列表中元素的顺序是否会导致for循环中的错误?

时间:2015-08-24 05:15:18

标签: python loops replace tuples

我正在使用一个简单的脚本来逃避某些HTML字符,并且遇到的错误似乎是由我的列表-pthread中的元素顺序引起的。我在循环中不是modifying the lists,所以我想不出我在这里忽略的任何Python /编程原理。

sched_yield

返回

escape_pairs

但是,当我将escape_pairs = [(">", "&gt;"),("<","&lt;"),('"',"&quot;"),("&","&amp;")] def escape_html(s): for (i,o) in escape_pairs: s = s.replace(i,o) return s print escape_html(">") print escape_html("<") print escape_html('"') print escape_html("&") 列表中的元素顺序切换为错误消失时

&amp;gt;
&amp;lt;
&amp;quot;
&amp;

2 个答案:

答案 0 :(得分:2)

是的,在您的第一次实施中,它可以。

让我们以>和列表 -

为例
escape_pairs = [(">", "&gt;"),("<","&lt;"),('"',"&quot;"),("&","&amp;")]

在迭代escape_pairs时,您首先获得>并将其替换为&gt;。这会导致字符串变为'&gt;。然后你继续迭代,最后找到("&","&amp;"),然后用&替换字符串中的&amp;,使结果成为你现在得到的结果。

更改列表的顺序时,会得到正确的结果。但这仍然只是因为你首先考虑了&,并且在此之后你还考虑了其​​他因素。

根据字典,您可以使用str.translate来共同翻译字符串。示例 -

>>> escape_pairs = [(">", "&gt;"),("<","&lt;"),('"',"&quot;"),("&","&amp;")]
>>> escape_dict = dict(escape_pairs)
>>> t = str.maketrans(escape_dict)
>>> ">".translate(t)
'&gt;'
>>> "> & <".translate(t)
'&gt; &amp; &lt;'

但是如果你要做的是HTML转义字符串,那么你应该使用标准库 - cgi -

>>> import cgi
>>> cgi.escape("< > &")
'&lt; &gt; &amp;'

此外,如果您使用 Python 3.2 + ,则可以使用html.escape代替,示例 -

>>> import html
>>> html.escape("< > &")
'&lt; &gt; &amp;'

答案 1 :(得分:1)

我将在您第一次调用escape_html函数时使用例如:print escape_html(">")

问题:
当你s.replace(i,o)第一次:

s = ">"

s = s.replace(i,o)

">".replace(">", "&gt;")

s = "&gt;"

但是现在当你到达最后一个replace()时,s的值从那之前就被保存了:

s = "&gt;"

s = s.replace(i,o)

"&gt;".replace("&","&amp;") #replaces the "&" in `"&gt;"` with `"&amp;"` 

s = "&amp;gt;"


为什么订单很重要?
这取决于订单的原因是因为当.replace("&","&amp;")首先出现时它将是:

s = ">"

s = s.replace(i,o)

">".replace("&","&amp;") #No "&"'s to replace so:

s = ">" 

然后您的程序继续按预期工作。

解决方案:
因为您尝试制作的更改始终只有一个在列表中,只要在进行了更改后返回。

def escape_html(s):
    for (i,o) in escape_pairs:
        s = s.replace(i,o)
        return s