嵌套列表-Python

时间:2018-09-26 16:31:23

标签: python list python-2.6

我有两个清单。我想与每个列表的“ 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]

我没有得到预期的输出。任何想法如何做到这一点?

2 个答案:

答案 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}}和ba的比较。

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)