具有大数据的Python列表字典算法

时间:2018-04-03 09:05:55

标签: python python-3.x list numpy python-3.6

我尝试使用两个python词典制作程序。 '如果dic1和dic2键是常见的,则多个dic1和dic2值,其他为0' 输出列表的键顺序和长度与dic1的相同。

dic1 = {'foo': 100,'bar': 200,'baz': 300,'qux': 400,'quux': 500}
dic2 = {'foo': 1,'quux': 2}

# output [100, 0, 0, 0, 1000]

当然,我可以使用下面的代码来完成。

output = []
for k,v in dic1.items():
    if k in dic2:
        output.append(v*dic2[k])
    else:
        output.append(0)
print(output)

但是字典的长度是1K-10K,所以由于速度问题,我不能使用for循环。 有人能知道解决这个问题的方法吗? 感谢。

3 个答案:

答案 0 :(得分:4)

嗯,我认为你无能为力。这些数据来自哪里?如果它是csv或其他什么,那么pandas解决方案可能会更快。如果它们必须是dict s那么我认为我能想到的最好的事情就是将其改为理解

output = [v * dic2[k] if k in dic2 else 0 for k, v in dic1.items()]

删除了相对昂贵的list.append电话。

一些时间:

import numpy as np  # for random generation
dic1 = {k: k for k in np.random.random(10000)}
dic2 = {k: k for k in np.random.choice(list(dic1), 1000)}

def f1():
    output = []
    for k, v in dic1.items():
        if k in dic2:
            output.append(v*dic2[k])
        else:
            output.append(0)

def f2():
    output = [v * dic2[k] if k in dic2 else 0 for k, v in dic1.items()]

def f3():
    output = [v * dic2.get(k, 0) for k, v in dic1.items()]

%timeit f1()
2.44 ms ± 12.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit f2()
1.66 ms ± 14.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit f3()
2.61 ms ± 59.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each

答案 1 :(得分:1)

output = [v * dic2.get(k, 0) for k, v in dic1.items()]

这不是一个循环...它是一个列表理解而不是在dic2中检查密钥存在然后选择值...对get的方便调用可以解决其中的问题值是乘法的一部分。

答案 2 :(得分:1)

为什么不在这里使用熊猫?这个解决方案将取消迭代。这样:

1)将词典转换为pandas DataFrame对象

one = pd.DataFrame({'foo': 100,'bar': 200,'baz': 300,'qux': 400,'quux': 500}, index=range(1)).T
two = pd.DataFrame({'foo': 1,'quux': 2},index=range(1)).T

2)连接两个数据帧

pd.concat([one*two], axis=1)

3)如果您希望将dataframe对象转换回字典,而不是

pd.concat([one*two], axis=1).to_dict().get(0)

注意:pandas concat操作会对字典键进行排序。如果你想保留orginial顺序,也许你应该先将原始输入(字典按键)排序,然后再将其转换为pandas dataframe对象。