我试图弄清楚什么时候字典keys()方法是强制性的。这是我的代码。
rawFeats = [(0, 'mouse'), (1, 'black'), (0, 'cat'), (1, 'tabby'), (2, 'mouse')]
OHEDict = {(0, 'cat'): 1, (1, 'tabby'): 4, (2, 'mouse'): 5}
indices = {OHEDict[i]:1.0 for i in rawFeats if i in OHEDict}
indices1 = {OHEDict[i]:1.0 for i in rawFeats if i in OHEDict.keys()}
print "indices = {0}\nindices1 = {1}".format(indices, indices1)
输出是:
indices = {1: 1.0, 4: 1.0, 5: 1.0}
indices1 = {1: 1.0, 4: 1.0, 5: 1.0}
我可以理解索引1工作得很好,因为(0, 'cat')
是键之一,但为什么索引会产生相同的结果?任何提示将不胜感激。顺便说一句,对于大数据集,索引的性能比索引1要好得多。
最佳答案
在 python2.x 上,dict.keys
(恕我直言)或多或少毫无值(value)。您可以直接迭代字典的键:
for key in d:
...
这比迭代键更有效:
for key in d.keys():
...
它创建一个单独的列表,然后然后对其进行迭代 - 有效地进行两次迭代+一堆额外的内存开销,因为拥有一个一次性列表,等等,等等。
<小时/>您的用例实际上是对 key 进行成员资格测试。区别在于:
x in some_list # is "x" an item in the list?
和
x in some_dict # is "x" a key in the dictionary?
对 list
对象进行成员资格测试的时间复杂度为 O(N),但对 dict
对象进行成员资格测试的时间复杂度为 O(1)。因此,对于循环的每个“回合”,您都会执行 O(N) 列表构造和 O(N) 查找来查看该项目是否在列表中,而不是简单的 O(1) 哈希查找关键。
值得注意的是,如果您确实确实需要字典键的列表,您可以轻松获得它1:
list(d)
<小时/>
幸运的是,python3.x已经朝着正确的方向迈出了一步。 d.keys()
在 python3.x 中返回一个类似于 set
的对象。例如,您可以使用它来有效地计算两个字典键的交集,这在某些情况下可能很有用。
还值得指出的是,python3.x 中类似 set
的对象(称为 dict_keys
对象)也具有 O(1) 成员资格测试(如下所示)与 list
的 O(n) 成员资格测试相比,我们期望看起来像 set
的东西。
1因此,这适用于 python2.x 和 python3.x,因此当您尝试编写以下代码时记住这一点是一件好事兼容...
关于Python字典keys()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31468300/