我尝试使用两个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循环。 有人能知道解决这个问题的方法吗? 感谢。
答案 0 :(得分:4)
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对象。