У меня два списка. Я хочу сравнить друг с другом с индексом списка [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]
Я не получаю ожидаемого результата. Есть идеи, как это сделать?
Какой результат вы получите?
Я сомневаюсь, что вы имеете в виду a[1][2][3], который вернет 'n', вы имеете в виду индекс 1, 2 и 3?
Вы хотите сравнить пункты один, два и три из списков внутренний? Ваше решение сравнивает списки полныйвнутренний, я не вижу никакой индексации или срезов.
для e: g 'Marketing', 'connected', '10' из a [1] необходимо сравнить с b [1] и b [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)
Рассмотрите возможность добавления краткого описания того, как ваш код решает поставленный вопрос.
@HenryWoody - см. Редактирование: спасибо, я намеревался сделать это, но меня прервала работа.
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)