为什么 dict1.items() <= dict2.items() 和 dict1.viewitems() <= dict2.viewitems() 返回不同的结果?

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 兼容?

wim*_*wim 5

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)比较字典之间的大小。