Python字典keys()方法

标签 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}

我可以理解索引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/

相关文章:

python - 比较两个numpy数组的最快方法

python - “元组”对象没有属性 'startswith'

c# - Unity C# 脚本字典初始化程序不是 C# 4.0 语言规范的一部分

Javascript:了解应用于小费计算器的 map 和 reduce

将某些方面升级到 3.x 后 Python 坏了

python - 带有列表字段的 Flask-Restful-Swagger 模型类

python - Teradata Python 模块游标结果集在一次迭代后耗尽

list - Flutter:通用列表处理不同的键值对

c# - 增加字典中的数值

swift - 将具有不同值类型的快速字典传递给同一函数