web-dev-qa-db-ja.com

Pythonのリストの2つのリストで要素の平均を効率的に取得する方法

次の2つのリストがあります。

_mylist1 = [["lemon", 0.1], ["Egg", 0.1], ["muffin", 0.3], ["chocolate", 0.5]]
mylist2 = [["chocolate", 0.5], ["milk", 0.2], ["carrot", 0.8], ["Egg", 0.8]]
_

次のように、2つのリストの共通要素の平均を取得します。

_myoutput = [["chocolate", 0.5], ["Egg", 0.45]]
_

私の現在のコードは次のとおりです

_for item1 in mylist1:
    for item2 in mylist2:
        if item1[0] == item2[0]:
             print(np.mean([item1[1], item2[1]]))
_

ただし、2つのforループ(O(n^2)複雑さ)があるため、これは非常に長いリストでは非常に非効率的です。 Pythonでこれを行うためのより標準的で効率的な方法があるかどうか疑問に思っています。

50
EmJ

シンプルで非常にPython的なソリューションを次に示します。

result = [[x[0], (x[1] + y[1])/2] for x in mylist1 for y in mylist2 if x[0] == y[0]]

それはおそらくthe最速のソリューションではありませんが、Pythonリスト内包表記を使用してリストを反復することにより、このソリューションもOPも機能しないため、より高速です。リストキー値のインスタンスが複数ある場合は、np.meanを2つの値の単純な平均で置き換えます。

2
Mark