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

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

0 голосов
/ 26 сентября 2018

У меня есть два списка.я хочу сравнить друг с другом с индексом списка [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]

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018
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)
0 голосов
/ 26 сентября 2018
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 to *Сравнение 1058 * и 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...