Как сравнить элементы между списками кортежей? - PullRequest
1 голос
/ 01 мая 2020
new_list = [
    ('99', '99', '081589JC', 'Left'),
    ('99', '99', '051184EC', 'Right'),
    ('99', '99', '202020AZ', 'Center')
]

old_list = [
    ('081589JC', '99', '081251CG', 'Center'),
    ('99', '99', '061456JC', 'Left'),
    ('99', '99', '202020AZ', 'Above')
]

add_list = []
deL_list = []

for a in range(len(new_list)):
  if new_list[a][2] not in old_list:
    add_list.append[a]

for d in range(len(old_list)):
  if old_list[d][2] not in add_list:
    deL_list.append(d)

print(add_list)
print(deL_list)

add_list должен содержать кортежи new_list, содержащие '081589J C' и '051184E C'.

deL_list должен содержать кортежи old_list, содержащие '081251CG' и '061456J C '.

Это то, что идеально сработало бы, но поскольку мы имеем дело с кортежами, я не могу найти способ сравнить один элемент со всем списком, не выполняя индивидуальный сценарий, который не' Сценарий вообще не поможет. У меня нет проблем с проведением сравнения, когда это просто одноэлементный кортеж, а не целый ряд информации, которую они представляют. Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 01 мая 2020

Попробуйте, использование наборов делает более эффективным поиск различий и выполнение in проверок.

new_list = [
    ('99', '99', '081589JC', 'Left'),
    ('99', '99', '051184EC', 'Right'),
    ('99', '99', '202020AZ', 'Center')
]

old_list = [
    ('081589JC', '99', '081251CG', 'Center'),
    ('99', '99', '061456JC', 'Left'),
    ('99', '99', '202020AZ', 'Above')
]

old_keys = {it[2] for it in old_list}
new_keys = {it[2] for it in new_list}
added_keys = new_keys - old_keys
deleted_keys = old_keys - new_keys

add_list = [it for it in new_list if it[2] in added_keys]
del_list = [it for it in old_list if it[2] in deleted_keys]

print(add_list)
print(del_list)
0 голосов
/ 01 мая 2020

Спасибо за другое жизнеспособное решение, Спенсер!

Мне пришлось внести корректировку для l oop, поскольку он не работал должным образом с моей стороны.

комбинированный_сет = { ** new_dict, ** old_dict}

для ключа в comb_set: если ключ не в new_dict и ключ в old_dict: deL_list.append (old_dict [ключ]), elif ключ в new_dict и ключ не в old_dict: add_list. Append (new_dict [ключ])

0 голосов
/ 01 мая 2020

Если значение по индексу 2 в кортеже определяет уникальность кортежей в вашем случае, возможно, стоит хранить кортежи в словаре. Что-то вроде:

new_list = [
    ('99', '99', '081589JC', 'Left'),
    ('99', '99', '051184EC', 'Right'),
    ('99', '99', '202020AZ', 'Center')
]

old_list = [
    ('081589JC', '99', '081251CG', 'Center'),
    ('99', '99', '061456JC', 'Left'),
    ('99', '99', '202020AZ', 'Above')
]

def tuple_list_to_dict(tuple_list, key_index):
    ''' Converts a list of tuples to a dict mapping each tuples' key to the tuple '''
    return {tup[key_index]: tup for tup in tuple_list}

new_dict = tuple_list_to_dict(new_list, 2)
old_dict = tuple_list_to_dict(old_list, 2)

add_list = []
deL_list = []

# we use a set here to make sure we are looping over all the unique keys only once
for key in set(new_dict.keys() + old_dict.keys()):
    if key not in new_dict and key in old_dict:    
        deL_list.append(old_dict[key])
    elif key in new_dict and key not in old_dict:
        add_list.append(new_dict[key])

print(add_list)
print(deL_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...