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

前端之家收集整理的这篇文章主要介绍了python – 列表中元素的顺序是否会导致for循环中的错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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;

但是当我在escape_pairs列表中切换元素的顺序时,bug就消失了

>>> escape_pairsMod = [("&","&amp;"),(">","&gt;")]

&gt;
&lt;
&quot;
&amp;
最佳答案
是的,在您的第一次实施中,它可以.

让我们看一下>和清单 –

escape_pairs = [(">","&amp;")]

在遍历escape_pairs时,首先得到>并用& gt;替换它.这导致字符串变为’& gt; .然后你继续迭代,最后你找到(“&”,“& amp;”),然后你替换&在带有& amp;的字符串中,使结果成为你现在得到的结果.

更改列表的顺序时,您将获得正确的结果.但这仍然只是因为你首先考虑到&只有在那之后你还考虑了其​​他.

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

>>> escape_pairs = [(">","&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;'

猜你在找的Python相关文章