Как сравнить два двухмерных списка по элементам python? - PullRequest
0 голосов
/ 07 января 2020

У меня есть два двухмерных списка: оба имеют одинаковый размер с неизвестным размером (отличаются для разных наборов списков)

Например:

A = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Teacher'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

B = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Police'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

Я хочу сравнить элемент файлов мудро (например: a[0][1] == b[0][1]) для всех элементов и выведите разницу с индексом элемента.

Я хотел бы получить что-то вроде этого:

a[1][2] = Teacher <> b[1][2] = Police

Было бы здорово, если бы Я мог бы сравнить списки, используя первичный ключ (ID), если список не в порядке с выводом, как показано ниже:

Profession of ID = 1 does not match, i.e Teacher <> Police

Примечание: файл может быть очень большим (матрица 100 * 10000)

Спасибо.

Ответы [ 4 ]

1 голос
/ 07 января 2020

Вы можете сделать это:

A = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Teacher'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

B = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Police'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

A = {a[0]: {'Name': a[1], 'Profession': a[2]} for a in A[1:]}
B = {b[0]: {'Name': b[1], 'Profession': b[2]} for b in B[1:]}

for a_id, a_content in A.items():
    a_profession = a_content['Profession']
    b_profession = B[a_id]['Profession']
    equal_profession = a_profession == b_profession
    match = 'matches' if equal_profession else 'does not match'
    diff_profession = f", i.e {a_profession} <> {b_profession}" if not equal_profession else ''
    print(f"Profession of ID = {a_id} {match}{diff_profession}")

Какие выходы:

>>> Profession of ID = 1 does not match, i.e Teacher <> Police
>>> Profession of ID = 2 matches
>>> Profession of ID = 3 matches

0 голосов
/ 07 января 2020

Чтобы сравнить элементы списка, используя их первичный ключ, давайте проиндексировать их по ключу, используя словарь:

A_dict = {a[0]: a[1:] for a in A}
B_dict = {b[0]: b[1:] for b in B}

Затем выполните итерации по ключам и столбцам и выведите различия:

column_names = A[0][1:]
for id in A_dict.keys():
    for column in range(len(column_names)):
        if A_dict[id][column] != B_dict[id][column]:
            print(f"{column_names[column]} of ID = {id} does not match, "
                  f"i.e {A_dict[id][column]} <> {B_dict[id][column]}")

Что дает желаемый результат:

Profession of ID = 1 does not match, i.e Teacher <> Police

Редактировать: Чтобы ответить на ваш комментарий, если ваш идентификатор не нужен в первом двоеточии, он немного сложнее:

# get the number of the 'ID' column
column_names = A[0]
column_id = column_names.index('ID')

# get the column names without 'ID'
values_name = column_names[0:column_id] + column_names [column_id+1:]

# create a dictionary with keys in column `column_id`
# and values the list of the other column values
A_dict = {a[column_id]: a[0:column_id] + a[column_id+1:] for a in A}
B_dict = {b[column_id]: b[0:column_id] + b[column_id+1:] for b in B}

# iterate on the keys and on the other columns and print the differences
for id in A_dict.keys():
    for column in range(len(column_names) - 1):
        if A_dict[id][column] != B_dict[id][column]:
            print(f"{values_name[column]} of ID = {id} does not match, "
                  f"i.e {A_dict[id][column]} <> {B_dict[id][column]}")
0 голосов
/ 07 января 2020

Следующий код должен выполнить работу:

for i in range(len(A)):
        B[i]
        A[i]
        if A[i] == B[i]: continue
        print(f'Differences in row{i}:', end='\n')
        for j in range(len(A[i])):
            if A[i][j] != B[i][j]:
                print(f'    in col {j}: A = {A[i][j]}, B = {B[i][j]}', end='\n')

Для заданных A, B будет напечатано:

Differences in row1:
    in col 2: A = Teacher, B = Police

Должно работать для любого количества переменных, которые вы решили ввести. Обратите внимание, что f strings были введены только в python 3.6, поэтому, если у вас есть ошибки, вы можете изменить на string.format

0 голосов
/ 07 января 2020

Попробуйте это:

A = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Teacher'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

B = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Police'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

# If A and B have equal length
for k in range(len(A)):
    i = A[k]
    j = B[k]

    # If the nested lists of both A and B has same length
    l = len(i)-1
    while(l>=0):
        if not i[l] is j[l]:
            print(f"a[{k}][{l}] = {i[l]} <> b[{k}][{l}] = {j[l]}")
        l -= 1
...