我想弄清楚词典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}
我可以理解indices1运作良好,因为(0, 'cat')
是其中一个关键,但为什么索引会产生相同的结果呢?任何提示将不胜感激。顺便说一下,对于大数据集,指数的表现要比指数1好得多。
答案 0 :(得分:2)
在python2.x上,dict.keys
或多或少都是(IMHO)毫无价值。您可以直接迭代字典的密钥:
for key in d:
...
这比迭代密钥更有效:
for key in d.keys():
...
创建一个单独的列表,然后迭代它 - 有效地进行两次迭代+一堆额外的内存开销,有一个丢弃列表等等。
您的用例实际上正在对密钥进行成员资格测试。它的区别在于:
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
like对象(称为dict_keys
对象)也有O(1)成员资格测试(正如预期的那样)与set
的O(n)成员资格测试相比,看起来像list
的东西。
1 因此,这可以在python2.x 和 python3.x中使用,所以当你需要记住它时,这是件很好的事情。尝试编写与...相兼容的代码
答案 1 :(得分:0)
两者都指(迭代)字典键。
for i in dic:
等于
for i in dic.keys():
答案 2 :(得分:0)
x in dict
其中dict
是一个python字典会返回True
当且仅当x
是dict
中某些条目的键时。