Проверьте список списков против другого и выведите их на основе указанных c совпадений - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть два списка списков.

List1 = [['X', '1', 'P'], ['D', '2', 'Y']]

List2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]

Примечание: list2 всегда будет содержать больше элементов, чем list1.

Я хотел бы проверить list1 для List2 и вернуть все значения list1, чтобы оба элемента списка [0] и [1] были одинаковыми.

Итак, мой окончательный результат должен быть:

List3 = [['X', '1', 'P']] 

Ответы [ 5 ]

2 голосов
/ 07 апреля 2020

Один из способов сделать это эффективно - создать набор поиска с кортежами интересующих вас значений. Затем вы можете создать простое понимание списка для фильтрации:

List1 = [['X', '1', 'P'], ['D', '2', 'Y']]
List2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]

lookup = set(tuple(l[:2]) for l in List2)

[l for l in List1 if tuple(l[:2]) in lookup]
# [['X', '1', 'P']]
1 голос
/ 07 апреля 2020

Это будет работать:

[e1 for e2 in List2 for e1 in List1 if e1[:2] == e2[:2]]
1 голос
/ 07 апреля 2020

Другие ответы здесь предполагают, что списки , соответствующие , расположены в том же порядке. Вот решение, которое не работает:

list1 = [['X', '1', 'P'], ['D', '2', 'Y']]
list2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]

list3 = [i for i in list1 if tuple(i[:2]) in [tuple(i[:2]) for i in list2]]
print(list3)

Вывод:

[['X', '1', 'P']]

Чтобы сделать вышеизложенное более эффективным, вы можете кэшировать переменную в списке внутри условного выражения списка

list1 = [['X', '1', 'P'], ['D', '2', 'Y']]
list2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]

list2_tuples = set(tuple(i[:2]) for i in list2)
list3 = [i for i in list1 if tuple(i[:2]) in list2_tuples]
print(list3)

Выход:

[['X', '1', 'P']]
1 голос
/ 07 апреля 2020

Используйте следующий код:

list1 = [['X', '1', 'P'], ['D', '2', 'Y']]
list2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]
similar_elements = [list1[i] for i in range(len(list1)) if list2[i][:-1]==list1[i][:-1]]
1 голос
/ 07 апреля 2020
for l1 in list1:
    for l2 in list2:
        if l1[0] == l2[0] and l1[1] == l2[1]:
            print(l1)    # or append to list3

Или, в понимании списка:

list3 = [l1 for l1 in list1 for l2 in list2 if l1[0] == l2[0] and l1[1] == l2[1]]

Все просто, выполните итерации по обоим спискам и проверьте наличие элементов 0 и 1.

...