我想知道dictionary 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)
输出为:
^{pr2}$我可以理解indicates1工作得很好,因为(0, 'cat')
是其中一个关键,但是为什么索引的结果是相同的呢?如有任何提示,我们将不胜感激。顺便说一句,对于大数据集来说,指数的性能远远好于指标1。在
在python2.x上,
dict.keys
或多或少毫无价值。您可以直接迭代字典的键:这将比迭代键更有效:
^{2}$这就形成了一个单独的列表,然后然后有效地对其进行迭代两次+一堆额外的内存开销,比如一个丢弃的列表,等等
您的用例实际上是在对键进行成员资格测试。区别在于:
以及
对
list
对象的成员资格测试是O(N),而对dict
的成员资格测试是O(1)。因此,对于循环的每一个“回合”,您都要执行一个O(N)list构造和一个O(N)查找,以查看该项是否在列表中,而不是对键进行简单的O(1)哈希查找。在值得注意的是,如果你真的需要一个字典的键列表,你可以很容易地得到它
幸运的是,python3.x已经朝着正确的方向迈出了一步。
d.keys()
在python3.x中返回一个类似于set
的对象。您可以使用它来高效地计算两个字典的键的交集,例如,这在某些情况下是有用的。在同样值得指出的是,与
list
的O(n)成员身份测试相比,python3.x中的set
类对象(称为dict_keys
对象)也具有O(1)成员身份测试(这是对看起来像set
的对象的预期)。在因此,在python2.x和python3.x中,这是一件很好的事情,当您试图编写与以下任何一种兼容的代码时,请记住这一点
两者都只引用(迭代)字典键。在
等于
^{2}$x in dict
其中dict
是python字典返回True
当且仅当{相关问题 更多 >
编程相关推荐