Aet*_*nus 2 python dictionary python-2.7 python-3.x
我很困惑为什么 .items() 在将两个字典作为列表进行比较时返回的结果与 .viewitems() 不同。
# python 2.7
d1 = {'1': '10', '2': '20'} # two key-value pairs
d2 = {'3': '30', '4': '40', '5': '50'} # three key-value pairs
print d1 <= d2 # True
print d1.items() <= d2.items() # True
print d1.viewitems() <= d2.viewitems() # False
print d1.items() # [('1', '10'), ('2', '20')]
print d1.viewitems() # dict_items([('1', '10'), ('2', '20')])
Run Code Online (Sandbox Code Playgroud)
似乎 .items() 和 .viewitems() 之间的主要区别在于 .items() 返回一个列表,而 viewitems() 返回一个 dict_items 东西。
在比较字典之间的大小时,是否建议只使用 d1 <= d2 而不是 viewitems 或 items ?
另外,如何使其与 Python 3 兼容?
d1 <= d2 # True
Run Code Online (Sandbox Code Playgroud)
情况很复杂。这是实现细节。请参阅比较运算符对字典的作用是什么?TL;DR:在 Python 2.x 中,较短的字典总是比较长的字典小,但在 Python 3.x 中,字典根本不可排序。
d1.items() <= d2.items() # True
Run Code Online (Sandbox Code Playgroud)
这是列表的字典序比较。这个True结果是可靠的,因为每个键d1都小于 的任何键d2。要使此代码交叉兼容,您必须显式转换为列表。
d1.viewitems() <= d2.viewitems() # False
Run Code Online (Sandbox Code Playgroud)
这是一个类似子集的检查。该False结果是可靠的,因为d1它不是d2. 要使此代码交叉兼容,请使用six.viewitems或类似。
在比较字典之间的大小时,是否建议只使用 d1 <= d2 而不是 viewitems 或 items ?
两者都不是,用于len(d1) <= len(d2)比较字典之间的大小。