Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python 두 사전 목록 비교

이 게시물에서는 Python에서 두 사전 목록을 비교하고 두 목록의 차이점을 출력하는 방법을 살펴봅니다.

비교 방법은 키 을 비교합니다. 사전의 값.

또한 Python에서 두 개의 사전 목록을 비교할 때 요소의 순서는 중요하지 않습니다.

Python에서 사전 목록 비교

if __name__ == '__main__':

    list_1 = [
        {'id': '123-abc', 'name': 'Mike', 'age': 40},
        {'name': 'John', 'age': 34, 'id': '123-efg'},
        {'age': 32, 'id': '123-xyz', 'name': 'Aly'}
    ]

    list_2 = [
        {'name': 'Mike', 'id': '123-abc', 'age': 40},
        {'id': '123-efg', 'age': 34, 'name': 'John'},
        {'id': '123-xyz', 'name': 'Aly', 'age': 32}
    ]

    assert [i for i in list_1 if i not in list_2] == []

위 코드에서 list_1list_2 같다. 즉, 각 사전은 두 목록에 동일한 항목(키 및 값)을 포함합니다. 각 사전의 요소 순서는 관련이 없습니다.

사전 목록 비교 - 차이점 인쇄

목록에서 다른 사전 항목을 인쇄할 수도 있습니다.

예:

if __name__ == '__main__':

    list_1 = [
        {'id': '123-abc', 'name': 'Mike', 'age': 40},
        {'id': '123-efg', 'name': 'John', 'age': 24},
        {'id': '123-xyz', 'name': 'Aly', 'age': 35}
    ]

    list_2 = [
        {'id': '123-abc', 'name': 'Mike', 'age': 40},
        {'id': '123-efg', 'name': 'Jon', 'age': 24},
        {'id': '123-xyz', 'name': 'Aly', 'age': 32}
    ]

    for i in list_1:
        if i not in list_2:
            print(i)

출력:

{'id': '123-efg', 'name': 'John', 'age': 24}
{'id': '123-xyz', 'name': 'Aly', 'age': 35}

위의 방법을 작성하는 또 다른 방법은 다음과 같습니다.

def compare_two_lists(list1: list, list2: list) -> bool:
    """
    Compare two lists and logs the difference.
    :param list1: first list.
    :param list2: second list.
    :return:      if there is difference between both lists.
    """
    diff = [i for i in list1 + list2 if i not in list1 or i not in list2]
    result = len(diff) == 0
    if not result:
        print(f'There are {len(diff)} differences:\n{diff[:5]}')
    return result

Pandas DataFrame을 사용하여 두 목록 변환

아래 예제 코드는 Pandas DataFrame을 사용하여 두 목록을 비교하는 방법을 보여줍니다.

from pandas import DataFrame
import pandas as pd

def compare_two_lists(list1: list, list2: list) -> bool:
    """
    Compare two lists and logs the difference.
    :param list1: first list.
    :param list2: second list.
    :return:      if there is difference between both lists.
    """
    df1 = pd.DataFrame(list1)
    df2 = pd.DataFrame(list2)
    diff = dataframe_difference(df1, df2)
    result = len(diff) == 0
    if not result:
        print(f'There are {len(diff)} differences:\n{diff.head()}')
    return result

def dataframe_difference(df1: DataFrame, df2: DataFrame) -> DataFrame:
    """
    Find rows which are different between two DataFrames.
    :param df1: first dataframe.
    :param df2: second dataframe.
    :return:    if there is different between both dataframes.
    """
    comparison_df = df1.merge(df2, indicator=True, how='outer')
    diff_df = comparison_df[comparison_df['_merge'] != 'both']
    return diff_df