嗨我正在尝试做Python的简单任务,无论字典的键是否相等。 这是我的示例代码
print(loc.keys())
这是我的示例数据。如果我打印出loc的键值,那么我得到了......
print(loc.keys() == ['latitude', 'longitude', 'timestamp', 'name', 'keywords'])
打印:dict_keys(['纬度','经度','时间戳','名称','关键字'))
所以我想做的是检查数据是否与字典的密钥相同。我使用它但它根本不起作用....
{{1}}
这仍然让我失败。有没有其他方法可以让我变成虚假的?
答案 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