Вложенный список - Python

У меня два списка. Я хочу сравнить друг с другом с индексом списка [1] [2] [3] из «a» каждого списка с другим индексом списка [1] [2] [3] из «b». Если это совпадение, то игнорировать, в противном случае вернуть весь список.

a = [['Eth1/1/13', 'Marketing', 'connected', '10', 'full', 'a-1000'], ['Eth1/1/14', 'NETFLOW02', 'connected', '10', 'full', '100']]

b = [['Eth1/1/13', 'NETFLOW02', 'connected', '15', 'full', '100'], ['Eth1/1/14', 'Marketing', 'connected', '10', 'full', 'a-1000']]

Желаемый результат:

Diff a:

Eth1/1/14  NETFLOW02   connected    10   full    100

Diff b:

Eth1/1/13  NETFLOW02    connected    15   full    100

Что я пытаюсь:

p = [i for i in a if i not in b]
for item in p: 
      print item[0]
print "\n++++++++++++++++++++++++++++++\n"
q = [i for i in b if i not in a]
for item in q: 
      print item[0]

попробовал ниже, но удалось сопоставить только индекс 1 внутреннего списка, индекс 2 и 3 все еще необходимо сопоставить ..

[o for o in a if o[1] not in [n[1] for n in b]

Я не получаю ожидаемого результата. Есть идеи, как это сделать?

stackoverflow.com/questions/6486450/…
Carlo 1585 26.09.2018 18:37

Какой результат вы получите?

Swift 26.09.2018 18:38
«Я не получаю ожидаемого результата». В чем ошибка? Какой результат вы получили?
Austin 26.09.2018 18:38

Я сомневаюсь, что вы имеете в виду a[1][2][3], который вернет 'n', вы имеете в виду индекс 1, 2 и 3?

rahlf23 26.09.2018 18:39

Вы хотите сравнить пункты один, два и три из списков внутренний? Ваше решение сравнивает списки полныйвнутренний, я не вижу никакой индексации или срезов.

wwii 26.09.2018 18:40

для e: g 'Marketing', 'connected', '10' из a [1] необходимо сравнить с b [1] и b [2] и так далее .. если все совпадают, игнорируйте .. если не совпадают затем верните весь список ..

Nirmal Gauda 26.09.2018 18:44

Отредактировал свой ответ, извините за первый. Я совершенно неправильно понял вопрос, лол.

Swift 26.09.2018 22:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
for sublista in a:
    if not any(sublista[1:4] == sublistb[1:4] for sublistb in b):
        print(sublista)

Вам нужен внутренний цикл, чтобы каждый подсписок из списка a можно было сравнивать с каждым подсписок в списке b. Внутренний цикл выполняется с помощью генератор выражения. Ломтики используются для сравнения только части подсписки. Встроенная функция any использует выражение генератора; это ленивый, и он вернет True со сравнением эквивалентности первыйTrue. Это напечатает каждый подсписок в a, который не имеет соответствия в b - чтобы распечатать каждый подсписок в b, который не имеет соответствия в a, поместите b во внешний цикл и a во внутренний цикл.

Вот эквивалент без использования выражения генератора или any:

for sublista in a:
    equal = False
    for sublistb in b:
        if sublista[1:4] == sublistb[1:4]:
            break
    else:
        print(sublista)

Иногда полезно использовать operator.itemgetter, чтобы вы могли использовать имена для фрагментов, которые могут сделать код более понятным:

import operator
good_stuff = operator.itemgetter(1,2,3)
for sublista in a:
    if not any(good_stuff(sublista) == good_stuff(sublistb) for sublistb in b):
        print(sublista)

itertools.product удобно объединять в пары генерирует и может использоваться вместо вложенных циклов выше. Далее используется словарь (defaultdict) для хранения результатов сравнения для каждого подсписка в a и b, затем проверяется, были ли совпадения - он выполняет сравнения как a с b, так и b с a.

import itertools, collections
pairs = itertools.product(a, b)
results = collections.defaultdict(list)
for sub_one, sub_two in pairs:
    comparison = good_stuff(sub_one) == good_stuff(sub_two)
    results[tuple(sub_one)].append(comparison)
    results[tuple(sub_two)].append(comparison)

for sublist, comparisons in results.items():
    if any(comparisons):
        continue
    print(sublist)

# or
from pprint import pprint
results = [sublist for sublist, comparisons in results.items() if not any(comparisons)]
pprint(results)

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

Henry Woody 27.09.2018 02:12

@HenryWoody - см. Редактирование: спасибо, я намеревался сделать это, но меня прервала работа.

wwii 27.09.2018 17:23
for v in a,b:
    for items in v:
        if 'NETFLOW02' in items:
            print('\t'.join(items))

Я не уверен, что это подходит для ваших целей, но вы, кажется, хотите захватить результаты сетевого интерфейса NETFLOW02 из этих двух списков.

Я уверен, что, вероятно, есть причина, по которой это неприемлемо, но вы также можете расширить это, чтобы включить другие ключевые слова в более длинные списки, ну, ну, любую длину списков, которые вложены, насколько объяснено в вашем вопросе. Для этого вам нужно будет создать другой список, гипотетически keywords = ['NETFLOW02','ETH01'].

Затем мы просто перебираем и этот список.

results = []
for v in a,b:
    for item in v:
        for kw in keywords:
            if kw in item:
            results.append(item)
            print('\t'.join(item))
print(results)

Другие вопросы по теме

Pandas - перебирать фрейм данных и присоединяться, если какой-либо элемент списка соответствует любому элементу другого списка
Haskell - создание списка на основе условий, возвращаемых функциями
Найдите частоту взаимосвязей тегов в списках (попарная корреляция?)
Python, как не требовать дополнительного места в конце списка?
Как проверить, можно ли найти элементы в списке как элемент в другом списке
Почему результат с использованием приведенного ниже кода отличается, если дисплей не используется для ввода?
Реализовать массив с помощью связанного списка
Принимать список в функции и использовать записи списка в качестве имен новых списков?
Как установить флаг в одном списке для идентификаторов, которые соответствуют идентификаторам в другом списке, используя лямбда-выражение с #
Добавление клонов в список происходит медленно