我正在使用httpagentparser库来剖析用户代理。但是,在相同输入上运行相同命令时,无论出于何种原因,我得到的排序结果都不同。
------ Construction foobar ------
foo-1 Constructor
foo-2 Move constructor
foo-1 Destructor
------ Construction superman ------
superman-1 Constructor
superman-2 Move constructor
superman-1 Destructor
------ Show the vector ------
foo-2
superman-2
------ Bye ------
foo-2 Destructor
superman-2 Destructor
user_agent_e="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
python3.5 -c "import httpagentparser; s='$user_agent_e'; print (httpagentparser.detect(s))"
{'browser': {'name': 'Chrome', 'version': '73.0.3683.86'}, 'bot': False, 'platform': {'name': 'Windows', 'version': '10'}, 'os': {'name': 'Windows', 'version': '10'}}
仅使用这种单线纸如何获得可预测的结果?
答案 0 :(得分:0)
这些都是一样的。
>>> a={'bot': False, 'os': {'version': '10', 'name': 'Windows'}, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}, 'platform': {'version': '10', 'name': 'Windows'}}
>>> b={'platform': {'version': '10', 'name': 'Windows'}, 'bot': False, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}, 'os': {'version': '10', 'name': 'Windows'}}
>>> c={'browser': {'name': 'Chrome', 'version': '73.0.3683.86'}, 'bot': False, 'os': {'name': 'Windows', 'version': '10'}, 'platform': {'name': 'Windows', 'version': '10'}}
>>> d={'bot': False, 'os': {'version': '10', 'name': 'Windows'}, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}, 'platform': {'version': '10', 'name': 'Windows'}}
>>> e={'platform': {'version': '10', 'name': 'Windows'}, 'os': {'version': '10', 'name': 'Windows'}, 'bot': False, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}}
>>> a==b==c==d==e
True
这些是词典。字典未排序,因此键-值对的打印顺序是随机的。仍然一样。
答案 1 :(得分:0)
原因是字典没有明确定义的顺序。您可以在已排序的字典上使用OrderedDict
(有顺序):
python3 -c "from collections import OrderedDict; import httpagentparser; s='$user_agent_e'; print (OrderedDict(sorted(httpagentparser.detect(s).items())))"
或展开:
from collections import OrderedDict
import httpagentparser; s='$user_agent_e'
print(OrderedDict(sorted(httpagentparser.detect(s).items())))
答案 2 :(得分:0)
在3.6以下的Python3版本中,字典未排序。
如果希望所有词典都保留插入顺序,则可以使用CPython 3.6或更高版本。否则,您可以将httpagentparser的输出转换为列表:
python3.5 -c "import httpagentparser; s='$user_agent_e'; print (list(map(list, httpagentparser.detect(s).items())))"
这不需要任何其他导入。
答案 3 :(得分:0)
键的顺序可以不同,例如哈希函数是基于随机的。不知道它在3.5中的特殊情况,但是我会说-这就是原因。
要获得所需的内容,我将使用json
,并使用已排序的键。
python3.5 -c "import httpagentparser; import json; s='$user_agent_e'; json.dumps(httpagentparser.detect(s), sort_keys=True)"