此代码按预期工作,但占用大量内存,运行时间比代码的任何其他部分长得多。
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
是不唯一的元组列表。必须有一个更好的方法来做到这一点。
感谢您的帮助。
答案 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,因此对于大输入来说,最终会更快。
row[0]
不包含重复项,请将set(row[0])
更改为row[0]
。try
永远不会失败,请将其删除。list(input1_map[i].values())
是不确定的。想一想。供参考,这是旧版本:
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