[英]Function not returning same result on each run
我正在嘗試用HTML實體替換特殊字符,但是在相同的輸入下結果是隨機的,我不明白為什么。
這是代碼:
def secure(text):
hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "¢", "©": "©", "÷": "÷", ">": ">", "<": "<", "µ": "µ", "·": "·", "¶": "¶", "±": "±", "€": "€", "£": "£", "®": "®", "§": "§", "™": "™", "¥": "¥", "á": "á", "Á": "Á", "à": "à", "À": "À", "â": "â", "Â": "Â", "å": "å", "Å": "Å", "ã": "ã", "Ã": "Ã", "ä": "ä", "Ä": "Ä", "æ": "æ", "Æ": "Æ", "ç": "ç", "Ç": "Ç", "é": "é", "É": "É", "è": "è", "È": "È", "ê": "ê", "Ê": "Ê", "ë": "ë", "Ë": "Ë", "í": "í", "Í": "Í", "ì": "ì", "Ì": "Ì", "î": "î", "Î": "Î", "ï": "ï", "Ï": "Ï", "ñ": "ñ", "Ñ": "Ñ", "ó": "ó", "Ó": "Ó", "ò": "ò", "Ò": "Ò", "ô": "ô", "Ô": "Ô", "ø": "ø", "Ø": "Ø", "õ": "õ", "Õ": "Õ", "ö": "ö", "Ö": "Ö", "ß": "ß", "ú": "ú", "Ú": "Ú", "ù": "ù", "Ù": "Ù", "û": "û", "Û": "Û", "ü": "ü", "Ü": "Ü", "ÿ": "ÿ", "\\":"\\\\"};
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èle, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']
>>> ================================ RESTART ================================
>>>
La Vie d\\'Adèle, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']
問題在於'
字符,有時返回為\\'
,有時返回為\\\\'
。
我認為它來自字典中的最后一項, "\\\\":"\\\\\\\\"
但我不明白為什么每次運行都不能對它進行相同的解釋。
正如您在答案中推測的那樣,問題在於字典上的迭代沒有定義的順序。
從Python 3文檔中 :
在字典上執行list(d.keys())會以任意順序返回字典中使用的所有鍵的列表(如果要對其進行排序,請改用sorted(d.keys()))。
它沒有明確說明,但是對items()也是一樣。
在這種情況下看到迭代之間的順序變化時,我感到有些驚訝,但是在這種情況下,任意表示意味着未定義-任何順序在技術上都是有效的。 如果您想要一致的結果,建議您重新設計算法,使其完全不影響項目的排序; 否則,首先對輸出進行排序或使用OrderedDict至少可以解決一致性問題。
我修改了如下功能,它正在工作:
def secure(text):
text.replace("\\", "\\\\")
hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "¢", "©": "©", "÷": "÷", ">": ">", "<": "<", "µ": "µ", "·": "·", "¶": "¶", "±": "±", "€": "€", "£": "£", "®": "®", "§": "§", "™": "™", "¥": "¥", "á": "á", "Á": "Á", "à": "à", "À": "À", "â": "â", "Â": "Â", "å": "å", "Å": "Å", "ã": "ã", "Ã": "Ã", "ä": "ä", "Ä": "Ä", "æ": "æ", "Æ": "Æ", "ç": "ç", "Ç": "Ç", "é": "é", "É": "É", "è": "è", "È": "È", "ê": "ê", "Ê": "Ê", "ë": "ë", "Ë": "Ë", "í": "í", "Í": "Í", "ì": "ì", "Ì": "Ì", "î": "î", "Î": "Î", "ï": "ï", "Ï": "Ï", "ñ": "ñ", "Ñ": "Ñ", "ó": "ó", "Ó": "Ó", "ò": "ò", "Ò": "Ò", "ô": "ô", "Ô": "Ô", "ø": "ø", "Ø": "Ø", "õ": "õ", "Õ": "Õ", "ö": "ö", "Ö": "Ö", "ß": "ß", "ú": "ú", "Ú": "Ú", "ù": "ù", "Ù": "Ù", "û": "û", "Û": "Û", "ü": "ü", "Ü": "Ü", "ÿ": "ÿ"};
for i, j in hsconvert.items():
text = text.replace(i, j)
return text
但我不明白為什么舊功能不起作用... x中的A ...並不總是相同的順序?
有時候,你的代碼替換\\\\
與\\\\\\\\
第一,然后\\'
與\\\\'
。 有時它反過來做。
示例(使用“ \\'”作為輸入):
如果首先執行\\\\
-> \\\\\\\\
,然后執行\\'
-> \\\\'
,則在第一次嘗試替換后會得到\\'
(因為沒有\\\\
,所以什么也不會發生),然后是\\\\'
在第二次之后。
但是如果以相反的方式進行操作,則在第一個之后得到\\\\'
,然后在第二個中將\\\\
替換為\\\\\\\\
,因此最終得到\\\\\\\\'
!
發生這種情況是因為hsconvert
是一個字典,因此它不是有序的,並且遍歷它( for
循環)不一定每次都以相同的方式發生。
解決該問題的方法很好,但是為了將來參考, collections
模塊中有一個OrderedDict
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.