5

我有一个对象

>>> L[0].f.items()
dict_items([('a', 1)])
>>> a3.f.items()
dict_items([('a', 1), ('c', 3)])

我想测试 L[0].f.items() 是否是 a3.f.items() 的子集。所以我做了以下事情:

>>> L[0].f.items() in a3.f.items()
False

但我希望 L[0].f.items() 是 a3.f.items() 的子集。为什么它返回False?如何测试一个字典项是否是另一个字典项的子集?

4

4 回答 4

6

您可以从列表中创建集合并查看一个集合是否是另一个集合的子集:

>>> list1 = [('a', 1), ('c', 3)]
>>> list2 = [('a', 1)]
>>> set(list2).issubset(list1)
True

或者,在您的情况下:

set(L[0].f.items()).issubset(set(a3.f.items()))
于 2013-08-11T09:20:48.040 回答
3

in测试左边的操作数是否是右边的元素。由于 dict 项目视图是类似集合的,因此您想要<=测试一个是否是另一个的子集:

>>> L[0].f.items() <= a3.f.items()
True

如果您想使用列表或其他类似非集合的可迭代对象来执行此操作,您可以构建一个集合并使用issuperset

>>> more = [1, 2, 3]
>>> less = [1, 2]
>>> set(more).issuperset(less)
True
于 2013-08-11T09:41:26.083 回答
2

您正在检查实际列表是否在其中,而不是元组。在这里,您可以使用all()

all(i in a3.f.items() for i in L[0].f.items())

甚至设置符号:

>>> set(L[0].f.items()) & set(a3.f.items())) == set(L[0].f.items())
True # Note that without the bool call this returns set([('a', 1)]), which can
     # be useful if you have more than one sublist tuples.
于 2013-08-11T09:19:23.917 回答
1

从 Python 2.7 开始,您就拥有dict.viewitems()了它将为您提供类似集合的行为。(哦,您似乎使用 Py3,因为您也有dict_items()对象!)

所以你可以使用

a = dict(a=1)
b = dict(a=1, c=3)
ai = a.viewitems() # items() on 3.x
bi = b.viewitems() # items() on 3.x
ai - bi
# gives a set([])
bi - ai
# gives a set([('c', 3)])
ai & bi
# gives ai
ai | bi
# gives bi

由于您想确保 的每个元素a都包含在 中b,因此您需要

ai & bi == ai

如果这是错误的,则a缺少 in 中的一个元素b,“干扰”&操作。

编辑:但它更简单 - 只是做

ai <= bi

你也可以在一组上做。

于 2013-08-11T09:34:40.390 回答