Saya punya dua kamus seperti ini:

dict1 = {'foo': 3.0, 'bar': 2.69, 'baz': 3.0}

dict2 = {'foo': {'11-abc1': 0.47}, 'bar': {'11-abc1': 0.30, '12-abc1': 0.0}, 'baz': {'14-abc1': 0.47}}

Sekarang saya ingin menggabungkan dua kamus ini sambil mengalikan nilainya. Outputnya akan terlihat seperti ini:

dict3 = {'foo': {'11-abc1': 3.0 * 0.47}, 'bar': {'11-abc1': 
 2.69 * 0.30, '12-abc1': 2.69 * 0.0}, 'baz': {'14-abc1': 3.0 * 0.47}}

Apa cara paling efisien untuk melakukannya?

0
user5017783 11 Desember 2017, 21:08

1 menjawab

Jawaban Terbaik

Anda dapat mencoba ini:

dict1 = {'foo': 3.0, 'bar': 2.69, 'baz': 3.0}
dict2 = {'foo': {'11-abc1': 0.47}, 'bar': {'11-abc1': 0.30, '12-abc1': 0.0}, 'baz': {'14-abc1': 0.47}}
new_dict = {a:{c:d*dict1[a] for c, d in b.items()} for a, b in dict2.items()}

Keluaran:

{'bar': {'12-abc1': 0.0, '11-abc1': 0.8069999999999999}, 'foo': {'11-abc1': 1.41}, 'baz': {'14-abc1': 1.41}}

Menggunakan pemformatan string untuk menunjukkan cara kerja kode:

dict1 = {'foo': 3.0, 'bar': 2.69, 'baz': 3.0}
dict2 = {'foo': {'11-abc1': 0.47}, 'bar': {'11-abc1': 0.30, '12-abc1': 0.0}, 'baz': {'14-abc1': 0.47}}
new_dict = {a:{c:"{}*{}".format(d, dict1[a]) for c, d in b.items()} for a, b in dict2.items()}

Keluaran:

{'bar': {'12-abc1': '0.0*2.69', '11-abc1': '0.3*2.69'}, 'foo': {'11-abc1': '0.47*3.0'}, 'baz': {'14-abc1': '0.47*3.0'}}

Sunting: Menjumlahkan nilai akhir:

import itertools
s = {'bar': {'12-abc1': 0.0, '11-abc1': 0.8069999999999999}, 'foo': {'11-abc1': 1.41}, 'baz': {'14-abc1': 1.41}}
new_s = list(itertools.chain(*[b.items() for a, b in s.items()]))
final_data = {a:sum(i[-1] for i in b) for a, b in itertools.groupby(sorted(new_s, key=lambda x:x[0]), key=lambda x:x[0])}

Keluaran:

{'12-abc1': 0.0, '11-abc1': 2.2169999999999996, '14-abc1': 1.41}
0
Ajax1234 11 Desember 2017, 19:13