我有两个清单。我想与每个列表的“ a”的列表索引[1] [2] [3]和“ b”的其他列表索引[1] [2] [3]相互比较。如果匹配,则忽略,否则返回整个列表。
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]
我没有得到预期的输出。任何想法如何做到这一点?
答案 0 :(得分:0)
for sublista in a:
if not any(sublista[1:4] == sublistb[1:4] for sublistb in b):
print(sublista)
您需要一个内部循环,以便可以将列表a
中的每个子列表与列表b
中的每个子列表进行比较。内部循环通过generator expression完成。 Slices仅用于比较子列表的一部分。内置函数any
使用生成器表达式;它是lazy,并且将返回<{> 1 与True
等价比较。这将打印True
中不匹配的a
中的每个子列表-打印{{1 }}在b
中不匹配,请将b
放在外部循环中,将a
放在内部循环中。
这里是等效项,不使用生成器表达式或b
:
a
有时最好使用operator.itemgetter
,因此您可以为切片使用名称,从而使代码更易懂。
any
itertools.product
方便地生成对,并且可以替代上面的嵌套循环。下面的代码使用dictionary (defaultdict
)来保存for sublista in a:
equal = False
for sublistb in b:
if sublista[1:4] == sublistb[1:4]:
break
else:
print(sublista)
和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)
中每个子列表的比较结果,然后检查是否存在匹配项-它同时将a
到{{ 1}}和b
到a
的比较。
b
答案 1 :(得分:0)
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)