回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有名单</p>
<pre><code>A = [(i,j,k,l,m)]
B = [(l,m,k)]
</code></pre>
<p>和字典</p>
<pre><code>C = {(i,j,k,l,m): val}
D = {(l,m,k): other_val}
</code></pre>
<p>我想创建一个<code>E</code>字典,以便</p>
<pre><code>E = {(i,j,k): C[(i,j,k,l,m)]*D[(l,m,k)]}
</code></pre>
<p>假设列表和字典中的所有索引约定都匹配。我有下面的非肾盂,非常缓慢的解决方案。对于非常大的<code>A</code>大小(例如,500万行),是否有任何Pythonic方法可以快速执行此操作</p>
<pre><code>E = {}
for i,j,k,l,m in A:
E[i,j,k] = sum(
C[i,j,k,l,m] * D[l2,m2,k2]
for l2,m2,k2 in B if l2==l and m2==m and k2==k)
</code></pre>
<p>下面是生成样本数据集的代码,该样本数据集接近要处理的实际大小</p>
<pre><code>import numpy as np
np.random.seed(1)
Irange = range(50)
Jrange = range(10)
Krange = range(80)
Lrange = range(8)
Mrange = range(18)
A = [
(i,j,k,l,m)
for i in Irange
for j in Jrange
for k in Krange
for l in Lrange
for m in Mrange]
B = [
(l,m,k)
for k in Krange
for l in Lrange
for m in Mrange]
C = {key: np.random.uniform(1,10) for key in A}
D = {key: np.random.uniform(0,1) for key in B}
E = {}
for i,j,k,l,m in A:
E[i,j,k] = sum(
C[i,j,k,l,m] * D[l2,m2,k2]
for l2,m2,k2 in B if l2==l and m2==m and k2==k)
</code></pre>