我使用下面的代码来迭代字典列表,以找到相应的键'5‘,并在找到比较值时。虽然它工作的很好,我相信它可以得到改进,以获得一个快速的性能。还有什么其他方法可以实现同样的结果呢?
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])发布于 2014-03-30 17:22:11
首先:您没有使用大部分listA;您只关心来自dictA[5]的值。因此,让我们在允许快速访问的数据结构中提取您所关心的比特:
interesting_vals = frozenset([dictA[5] for dictA in listA if 5 in dictA])现在我们只需要检查listB。两种方法。最明显的第一条是:
result = [dictB[5] for dictB in listB
if 5 in dictB and dictB[5] in interesting_vals]或者,如果您期望大多数dictB具有一个[5]元素,那么这可能会更快,因为它结合了访问和存在性检查(使用真实数据来分析它!):
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的值是可选的,并且有一个与大多数内建类是一致的散列,但是一些自定义类可能没有正确地实现哈希。
发布于 2014-03-30 17:08:42
快速检查还表明,4 in dictA比4 in dictA.keys()更快。
发布于 2014-03-30 17:06:23
您必须对代码进行概要分析,以查看是否有改进,但通常使用内置程序进行过滤是朝着正确方向迈出的一步,而不是自己编写代码,因为它将跳过对过滤器样板代码的解释。
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。
https://stackoverflow.com/questions/22746870
复制相似问题