字典查找效率

时间:2015-02-19 09:26:23

标签: python optimization dictionary lookup

我有一个列表列表,我希望根据查询添加一个列表,其中包含来自字典的求和值。

下面的代码有效,但速度不够快,无法处理我拥有的数据量,因此问题是如何更有效地执行此操作。我正在使用Python 2.7。

people = [
            [['A'], ['B']], 
            [['B'], ['A', 'C', 'E', 'D']], 
            [['C'], ['B']], 
            [['D'], ['B', 'E']], 
            [['E'], ['H', 'B', 'D']], 
            [['F']], 
            [['G']], 
            [['H'], ['E']], 
            [['I']]
        ]

 dollars = {'A': 575, 'B': 628, 'C': 693, 'D': 456, 'E': 1595, 'F': 1366, 'G': 1596, 'H': 2667, 'I': 2145}

我尝试过(以下)以下内容:

num_dos = 2 # a placeholder, will be user input

for groups in people:
    groups.append([])
    for i in range(min(len(groups), num_dos)):
        groups[-1].extend([v for k, v in dollars.items() if k in groups[i]])
    groups[-1] = sum(groups[-1])   

people.sort(key = lambda x: x[-1], reverse = True)

给出了期望的结果:

[
    [['E'], ['H', 'B', 'D'], 5346], 
    [['H'], ['E'], 4262], 
    [['B'], ['A', 'C', 'E', 'D'], 3947], 
    [['D'], ['B', 'E'], 2679], 
    [['I'], 2145], 
    [['G'], 1596], 
    [['F'], 1366], 
    [['C'], ['B'], 1321], 
    [['A'], ['B'], 1203]
]

1 个答案:

答案 0 :(得分:0)

不是迭代字典中的项目并测试它们是否在列表中,而是应该反过来:迭代列表中的项目并从字典中获取它们的值(如果有的话)。这样,它更快,因为列表中的查找是 O(n),而它更像是字典中的 O(1)。此外,似乎不需要所有这些中间数字列表;只需添加总和并将其添加到最后的列表中。

for groups in people:
    s = 0
    for i in range(min(len(groups), num_dos)):
        s += sum(dollars.get(x, 0) for x in groups[i])
    groups.append(s)