Python字典keys()方法

时间:2015-07-17 04:15:48

标签: python 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)

输出是:

indices = {1: 1.0, 4: 1.0, 5: 1.0}
indices1 = {1: 1.0, 4: 1.0, 5: 1.0}

我可以理解indices1运作良好,因为(0, 'cat')是其中一个关键,但为什么索引会产生相同的结果呢?任何提示将不胜感激。顺便说一下,对于大数据集,指数的表现要比指数1好得多。

3 个答案:

答案 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当且仅当xdict中某些条目的键时。