首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:如何快速迭代字典列表

Python:如何快速迭代字典列表
EN

Stack Overflow用户
提问于 2014-03-30 16:55:58
回答 6查看 1.4K关注 0票数 2

我使用下面的代码来迭代字典列表,以找到相应的键'5‘,并在找到比较值时。虽然它工作的很好,我相信它可以得到改进,以获得一个快速的性能。还有什么其他方法可以实现同样的结果呢?

代码语言:javascript
复制
listA = [{1:'One', 2:'Two', 3:'Three'}, {4:'Four', 5:'Five', 6:'Six'}]
listB = [{4:'Four', 5:'Five', 6:'Six'}, {7:'Seven', 8:'Eight', 9:'Nine'}]

result=[]
for dictA in listA:
    if not 5 in dictA.keys(): continue
    for dictB in listB:
        if 5 in dictB.keys() and dictB[5]==dictA[5]:
            result.append(dictB[5])
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-03-30 17:22:11

首先:您没有使用大部分listA;您只关心来自dictA[5]的值。因此,让我们在允许快速访问的数据结构中提取您所关心的比特:

代码语言:javascript
复制
interesting_vals = frozenset([dictA[5] for dictA in listA if 5 in dictA])

现在我们只需要检查listB。两种方法。最明显的第一条是:

代码语言:javascript
复制
result = [dictB[5] for dictB in listB
          if 5 in dictB and dictB[5] in interesting_vals]

或者,如果您期望大多数dictB具有一个[5]元素,那么这可能会更快,因为它结合了访问和存在性检查(使用真实数据来分析它!):

代码语言:javascript
复制
NA = object()  # Will compare different to everything in interesting_vals
result = [dictB[5] for dictB in listB if dictB.get(5, NA) in interesting_vals]

这个解决方案应该是O(len(listA) + len(listB)),如果列表很大,这比原来的O(len(listA) * len(listB))要好得多。

请注意,我假设dictA5的值是可选的,并且有一个与大多数内建类是一致的散列,但是一些自定义类可能没有正确地实现哈希。

票数 2
EN

Stack Overflow用户

发布于 2014-03-30 17:08:42

快速检查还表明,4 in dictA4 in dictA.keys()更快。

票数 3
EN

Stack Overflow用户

发布于 2014-03-30 17:06:23

您必须对代码进行概要分析,以查看是否有改进,但通常使用内置程序进行过滤是朝着正确方向迈出的一步,而不是自己编写代码,因为它将跳过对过滤器样板代码的解释。

代码语言:javascript
复制
for dictA in filter(lambda x : 4 in x, listA):
    for dictB in filter(lambda x : 5 in x, listB):
        if dictB[5]==dictA[5]:
            result.append(dictB[5])

此外,它还使它更短、更易读,这与Python的禅宗有关。您已经熟悉了Python程序的外观,因为您显然是在尝试编写类似于Python代码的C/Java。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22746870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档