Giả sử rằng các dicts xếp hàng như trong đầu vào ví dụ của bạn, bạn có thể sử dụng hàm >>> [(x, y) for x, y in pairs if x != y] [({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})] 0 để có được danh sách các cặp dicts liên quan, sau đó bạn có thể sử dụng >>> [(x, y) for x, y in pairs if x != y] [({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})] 1 để kiểm tra xem có sự khác biệt không:
>>> list_1 = [{'unique_id':'001', 'key1':'AAA', 'key2':'BBB', 'key3':'EEE'}, {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}] >>> list_2 = [{'unique_id':'001', 'key1':'AAA', 'key2':'DDD', 'key3':'EEE'}, {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}] >>> pairs = zip(list_1, list_2) >>> any(x != y for x, y in pairs) TrueHoặc để có được các cặp khác nhau:
>>> [(x, y) for x, y in pairs if x != y] [({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})]Bạn thậm chí có thể nhận các phím không khớp với từng cặp:
>>> [[k for k in x if x[k] != y[k]] for x, y in pairs if x != y] [['key2']]Có thể cùng với các giá trị liên quan:
>>> [[(k, x[k], y[k]) for k in x if x[k] != y[k]] for x, y in pairs if x != y] [[('key2', 'BBB', 'DDD')]]Lưu ý: Trong trường hợp bạn chưa được sắp xếp, bạn cũng có thể làm điều đó một cách dễ dàng: In case you're input lists are not sorted yet, you can do that easily as well:
>>> from operator import itemgetter >>> list_1, list_2 = [sorted(l, key=itemgetter('unique_id')) for l in (list_1, list_2)]Trong bài đăng này, chúng tôi xem xét cách so sánh hai danh sách từ điển trong Python và cũng in ra sự khác biệt giữa hai danh sách. Phương pháp so sánh so sánh các khóa và giá trị trong từ điển.
Ngoài ra, việc đặt hàng các yếu tố không quan trọng khi so sánh hai danh sách từ điển trong 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] == []Trong mã trên, >>> [(x, y) for x, y in pairs if x != y] [({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})] 2 và >>> [(x, y) for x, y in pairs if x != y] [({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})] 3 bằng nhau. Đó là, mỗi từ điển chứa cùng một mục (khóa và giá trị) trong cả hai danh sách. Thứ tự của các yếu tố trong mỗi từ điển là không liên quan.
So sánh danh sách từ điển - Sự khác biệt in
Chúng ta cũng có thể in những mục từ điển nào khác nhau trong danh sách:
Ví dụ:
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)Output:
{'id': '123-efg', 'name': 'John', 'age': 24} {'id': '123-xyz', 'name': 'Aly', 'age': 35}Một cách khác để viết phương thức trên là:
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 resultChuyển đổi hai danh sách bằng cách sử dụng gấu trúc DataFrame
Mã ví dụ dưới đây cho thấy cách so sánh hai danh sách bằng cách sử dụng gấu trúc 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