1. ホーム
  2. パイソン

[解決済み】Pythonで片方のリストにない要素を探す【重複】の巻

2022-04-17 13:51:19

質問

2 つのリストを比較して、一方のリストにはあるが他方のリストにはない特定の要素の新しいリストを作成する必要があります。例えば

main_list=[]
list_1=["a", "b", "c", "d", "e"]
list_2=["a", "f", "c", "m"] 

list_1 をループして、list_2 から list_1 にないすべての要素を main_list に追加したいです。

その結果は、次のようになるはずです。

main_list=["f", "m"]

pythonでやるにはどうしたらいいですか?

どのように解決するのですか?

TL;DR。

解決策 (1)

import numpy as np
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`

解決策 (2) ソートされたリストが欲しい

def setdiff_sorted(array1,array2,assume_unique=False):
    ans = np.setdiff1d(array1,array2,assume_unique).tolist()
    if assume_unique:
        return sorted(ans)
    return ans
main_list = setdiff_sorted(list_2,list_1)




EXPLANATIONS:

(1) NumPyの setdiff1d ( array1 , array2 , assume_unique = False ).

assume_unique は、「配列が既に一意であるかどうか」を尋ねます。

もし False であれば、ユニークな要素が最初に決定されます。

もし True の場合、この関数は要素が既に一意であるとみなし、一意でない要素の判定をスキップします。

この結果、一意な値は array1 その array2 . assume_uniqueFalse をデフォルトで使用します。

に拘るなら ユニーク 要素 (ベースは Chinny84のレスポンス を使うだけです(ここで assume_unique=False =>がデフォルト値)。

import numpy as np
list_1 = ["a", "b", "c", "d", "e"]
list_2 = ["a", "f", "c", "m"] 
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`



(2) 回答をソートしてほしい人のために、カスタム関数を作りました。

import numpy as np
def setdiff_sorted(array1,array2,assume_unique=False):
    ans = np.setdiff1d(array1,array2,assume_unique).tolist()
    if assume_unique:
        return sorted(ans)
    return ans

答えを出すには、実行します。

main_list = setdiff_sorted(list_2,list_1)


副音声

(a) 解決策2(カスタム関数 setdiff_sorted を返します。 リスト (と比較して 配列 を解決策1)にしました。

(b) 要素が一意であるかどうか確信が持てない場合は、単にNumPyのデフォルト設定である setdiff1d 複雑な例として何が考えられますか?注(c)を参照してください。

(c) 2つのリストのうち、どちらかが ではない 一意である。

セイ list_2 は一意ではありません。 list2 = ["a", "f", "c", "m", "m"] . キープ list1 をそのまま使用します。 list_1 = ["a", "b", "c", "d", "e"]

のデフォルト値を設定する assume_unique 収穫 ["f", "m"] (両方のソリューションで)。しかし、もし assume_unique=True を実行すると、両方のソリューションで ["f", "m", "m"] . なぜか?それは、ユーザーが要素が一意であると仮定しているからです)。従って、以下のようにするのがベターです。 assume_unique をデフォルト値に設定します。どちらの答えもソートされていることに注意してください。

パイソン numpy