Итерация элементов вложенных списков посредством индексов

Подскажите, пожалуйста, как быть при данной конструкции. Есть некий список с вложенными списками. Вложенных списков может быть любое количество:

[[10,2,4,12], [1,2,56,10], [1,13,25,78]]

Каждый вложенный список должен сравнивать свои индексы 0 и 1 с индексами 0 и 1 других вложенных списков и вне зависимости от их местоположения внутри основного списка. Если значения индекса 1 совпадает, а значение индекса 0 не совпадает, тогда добавить списки в новый список all = []

Есть лаконичные решения этого вопроса, кроме как использовать словари? Знаний написать грамотные костыли нет. Библиотека itertools не подойдет?

UPD Решений подобного характера ожидается много, поэтому если разжуете, буду очень признателен.


Ответы (1 шт):

Автор решения: pashkin5000

В данном случае подойдёт итератор itertools.combinations если вам нужно пробежаться по всем парам вложенных списков без учёта перестановки списков внутри пары, или itertools.permutations если учёт важен.

К примеру:

import itertools

a = [[10,2,4,12], [1,2,56,10], [1,13,25,78]]

for element1, element2 in itertools.combinations(a, 2):
    print(element1,element2)
'''
[10, 2, 4, 12] [1, 2, 56, 10]
[10, 2, 4, 12] [1, 13, 25, 78]
[1, 2, 56, 10] [1, 13, 25, 78]
'''

Или:

import itertools

a = [[10,2,4,12], [1,2,56,10], [1,13,25,78]]

for element1, element2 in itertools.permutations(a, 2):
    print(element1, element2)
'''
[10, 2, 4, 12] [1, 2, 56, 10]
[10, 2, 4, 12] [1, 13, 25, 78]
[1, 2, 56, 10] [10, 2, 4, 12]
[1, 2, 56, 10] [1, 13, 25, 78]
[1, 13, 25, 78] [10, 2, 4, 12]
[1, 13, 25, 78] [1, 2, 56, 10]
'''

Затем можно сравнить индексы 0 и 1 пар списков, и работать дальше. В вашем случае:

import itertools

a = [[10,2,4,12], [1,2,56,10], [1,13,25,78]]

for element1, element2 in itertools.combinations(a, 2):
    tupleInd = list(zip(element1, element2))

    index0 = tupleInd[0] # Кортеж, содержащий первые элементы двух списков
    index1 = tupleInd[1] # Кортеж, содержащий вторые элементы двух списков

    if index0[0] != index0[1] and index1[0] == index1[1]:
        print(element1, element2) # [10, 2, 4, 12] [1, 2, 56, 10]
        
        #do stuff...

При заданном a проходит только пара списков [10, 2, 4, 12] [1, 2, 56, 10], так как 10 != 1 и 2 == 2.

→ Ссылка