为了账号安全,请及时绑定邮箱和手机立即绑定

嵌套列表-Python

嵌套列表-Python

梦里花落0921 2021-06-21 15:30:35
我有两个清单。我想将每个列表的“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    100Diff 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 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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)来保存aand 中每个子列表的比较结果b,然后检查是否有匹配项 - 它同时进行atob和btoa比较。


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)


查看完整回答
反对 回复 2021-06-29
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

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)


查看完整回答
反对 回复 2021-06-29
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信