嵌套列表-Python

我有两个清单。我想将每个列表的“a”的列表索引 [1][2][3] 与“b”的其他列表索引 [1][2][3] 相互比较。如果匹配,则ignore ,如果没有则返回整个列表。


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]

我没有得到预期的输出。知道怎么做吗?


梦里花落0921
浏览 148回答 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 operatorgood_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)来保存aand 中每个子列表的比较结果b,然后检查是否有匹配项 - 它同时进行atob和btoa比较。import itertools, collectionspairs = 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)# orfrom pprint import pprintresults = [sublist for sublist, comparisons in results.items() if not any(comparisons)]pprint(results)

慕娘9325324

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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python