如何检查字典键值的相同?

时间:2017-12-06 07:36:53

标签: python dictionary

嗨我正在尝试做Python的简单任务,无论字典的键是否相等。 这是我的示例代码

print(loc.keys())

这是我的示例数据。如果我打印出loc的键值,那么我得到了......

print(loc.keys() == ['latitude', 'longitude', 'timestamp', 'name', 'keywords'])

打印:dict_keys(['纬度','经度','时间戳','名称','关键字'))

所以我想做的是检查数据是否与字典的密钥相同。我使用它但它根本不起作用....

{{1}}

这仍然让我失败。有没有其他方法可以让我变成虚假的?

3 个答案:

答案 0 :(得分:5)

字典是无序的数据结构,dict.keys()返回一个View对象,而不是一个列表,因此键与列表的简单比较不会起作用。幸运的是,View对象是类似于set的,您可以对它使用set操作。例如,

loc = {
    'latitude' :-90.0, 'longitude' : -180.0, 'timestamp': 1512531206, 
    'name': "SNU",  'keywords':["school, hard"],
}

print(loc.keys() == {'latitude', 'longitude', 'timestamp', 'name', 'keywords'})

<强>输出

True

在CPython 3.6+ dicts do 中保留了插入顺序,但这当前是一个实现细节,我们不应该依赖它。但除此之外,dict的项目可能已按任何顺序插入,因此假设密钥按特定顺序排列并不是一个好主意。

答案 1 :(得分:2)

在Python 3中,.keys返回一个行为就像一个集合的视图。您只需要更改2个字符(括号),即可将列表字面文字转换为 set 字面值:

>>> loc = {'latitude' :-90.0, 'longitude' : -180.0, 'timestamp': 1512531206, 
'name': "SNU",  'keywords':["school, hard"],}
>>> loc.keys() == {'latitude', 'longitude', 'timestamp', 'name', 'keywords'}
True

如果您想确保字典至少这些键,请使用.issubset / .issuperset。不幸的是,关键视图没有这些方法,所以你需要在集合上使用它。例如

>>> {'latitude', 'longitude'}.issubset(loc.keys())
True
>>> {'latitude', 'foobar'}.issubset(loc.keys())
False

请注意,在这种情况下,您甚至不需要使用.keys()

>>> {'latitude', 'longitude'}.issubset(loc)
True

答案 2 :(得分:1)

只需转换要设置的键列表并与另一组进行比较:

set(loc.keys()) == {'latitude', 'longitude', 'timestamp', 'name', 'keywords'}

正如@ juanpa.arrivillaga所指出的那样,你不需要将keys() dict转换成set,你就可以马上做到:

set(loc) == {'latitude', 'longitude', 'timestamp', 'name', 'keywords'}

注意:要获得最佳答案,请参阅@ PM2Ring answer