Python嵌套循环比较两个列表并更新字典

时间:2013-11-27 18:41:19

标签: python performance list compare

此代码按预期工作,但占用大量内存,运行时间比代码的任何其他部分长得多。

def function(input1, input2):
    mapping = []
    for item in input1:
        risks = {"A":0, "B":0, "C":0, "D":0, "E":0}
        temp = []
        for row in input2:
            if item in row[0]:
                for key in risks.keys():
                    if row[1] == key:
                        risks[key] += 1
        temp.append(item)
        for key in risks.keys():
            temp.append(risks[key])
        mapping.append(temp)
    return mapping

我希望找到一种更有效的方法来做到这一点,而且内存要少得多。 input1是唯一字符串的列表,input2是不唯一的元组列表。必须有一个更好的方法来做到这一点。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先是一些测试数据:

import random

input1 = list(range(1000))
input2 = [
    ([random.randint(0, 1000) for _ in range(100)], random.choice("ABCDE"))
    for _ in range(10000)
]

然后我的新功能:

def newfunction(input1, input2):
    input1_map = {i: dict.fromkeys("ABCDE", 0) for i in input1}

    for row in input2:
        for i1 in set(row[0]):
            try:
                input1_map[i1][row[1]] += 1
            except KeyError:
                pass

    return [[i] + list(input1_map[i].values()) for i in input1]

深度为2,而不是3,因此对于大输入来说,最终会更快。

  1. 如果row[0]不包含重复项,请将set(row[0])更改为row[0]
  2. 如果try永远不会失败,请将其删除。
  3. 选择更好的变量名称。我不知道这些东西代表什么,所以我的名字非常糟糕。
  4. 如果速度太令人担忧,最后的陈述可能会被微观优化掉,但我不认为它会有多大意义。
  5. list(input1_map[i].values())是不确定的。想一想。
  6. 供参考,这是旧版本:

    def function(input1, input2):
        mapping = []
        for item in input1:
            risks = {"A":0, "B":0, "C":0, "D":0, "E":0}
            temp = []
            for row in input2:
                if item in row[0]:
                    for key in risks.keys():
                        if row[1] == key:
                            risks[key] += 1
            temp.append(item)
            for key in risks.keys():
                temp.append(risks[key])
            mapping.append(temp)
        return mapping
    

    它通过了我的测试:

    function(input1, input2) == newfunction(input1, input2)
    #>>> True
    
相关问题