【问题标题】:Fast way to iterate over three dictionaries?快速迭代三个字典的方法?
【发布时间】:2019-12-03 20:01:38
【问题描述】:

我正在处理非常大的三个字典,如下所示:

dict_a = { ( 't','e' ) : [0.5,0.1,0.6],  ( 'a','b' ) : [0.2,0.3,0.9] }

dict_b = { ( 'a','b' ) : [0.1,0.5,0.3] , ( 't','e' ) : [0.6,0.1,0.6] }

dict_c = { ( 'a','b' ) : [0.1,0.5,0.3] , ( 't','e' ) : [0.6,0.5,0.6] }

我正在寻找这样的输出:

    name    first_value       second_value  third_value

0   (t, e)  [0.5, 0.1, 0.6] [0.6, 0.1, 0.6] [0.6, 0.5, 0.6]
1   (a, b)  [0.2, 0.3, 0.9] [0.1, 0.5, 0.3] [0.1, 0.5, 0.3]

我试过的是:

final_dict = {'name': [] , 'first_value' : [] ,'second_value': [] , 'third_value': [] }

for a,b in dict_a.items():
    for c,d in dict_b.items():
        for e,f in dict_c.items():
            if a==c==e:
                final_dict['name'].append(a)
                final_dict['first_value'].append(b)
                final_dict['second_value'].append(d)
                final_dict['third_value'].append(f)

这确实不是高效和优化的方式来完成这项任务。我正在考虑使用熊猫。

如何以最小的时间复杂度完成这项任务?

谢谢!

【问题讨论】:

标签: python python-3.x pandas loops dictionary


【解决方案1】:

因为这些是字典,您只需要遍历一个。您可以使用该键从其他人那里获取相应的值。

例子:

for key, value in dict_a.items():
        final_dict['name'].append(key)
        final_dict['first_value'].append(value)
        final_dict['second_value'].append(dict_b[key])
        final_dict['third_value'].append(dict_c[key])

【讨论】:

  • 为了可读性,我可能只使用for key_in dict_a。那么final_dict的赋值(除了第一个)都可以统一写成final_dict['...'].append(...[key])
  • (也可以确认一下,所有三个字典都具有相同的一组键。)
  • 我在考虑设置键的并集,然后迭代键以构建输出——以防某些 dict 恰好缺少某些条目。
【解决方案2】:

试试这个方法:-

df = pd.DataFrame([dict_a, dict_b, dict_c], index = ['first_value', 
'second_value', 'third_value']).T
df['names'] = df.index
df.index = [0, 1]
print(df)

输出:-

       first_value     second_value      third_value   names
0  [0.2, 0.3, 0.9]  [0.1, 0.5, 0.3]  [0.1, 0.5, 0.3]  (a, b)
1  [0.5, 0.1, 0.6]  [0.6, 0.1, 0.6]  [0.6, 0.5, 0.6]  (t, e)

【讨论】:

    【解决方案3】:

    怎么样:

    pd.DataFrame({i:d for i,d in enumerate([dict_a,dict_b,dict_c])} )
    

    输出:

                       0                1                2
    a b  [0.2, 0.3, 0.9]  [0.1, 0.5, 0.3]  [0.1, 0.5, 0.3]
    t e  [0.5, 0.1, 0.6]  [0.6, 0.1, 0.6]  [0.6, 0.5, 0.6]
    

    【讨论】:

      【解决方案4】:

      这是一种方法

      pd.concat([pd.Series(x) for x in [dict_a,dict_b,dict_c]],axis=1)
      Out[332]: 
                         0                1                2
      a b  [0.2, 0.3, 0.9]  [0.1, 0.5, 0.3]  [0.1, 0.5, 0.3]
      t e  [0.5, 0.1, 0.6]  [0.6, 0.1, 0.6]  [0.6, 0.5, 0.6]
      

      【讨论】:

        猜你喜欢
        • 2020-06-12
        • 1970-01-01
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 2020-05-03
        • 2014-08-09
        相关资源
        最近更新 更多