【问题标题】:Nested List -Python嵌套列表-Python
【发布时间】:2019-03-02 12:10:22
【问题描述】:

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

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

【问题讨论】:

  • 你得到什么输出?
  • “我没有得到预期的输出。” 错误是什么?你得到了什么输出?
  • 我怀疑你的意思是a[1][2][3],它会返回'n',你是指索引1、2和3吗?
  • 您想比较 inner 列表中的项目一、二和三吗?您的解决方案是比较 complete inner 列表,我没有看到任何索引或切片。

标签: python list python-2.6


【解决方案1】:
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 并将返回 Truefirst True 等效比较。这将打印a 中在b 中没有匹配的每个sub-list - 打印b 中没有匹配的每个sub-list 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 方便地生成 对,并且可以用作上面嵌套循环的替代品。下面使用dictionary (defaultdict) 来保存ab 中每个子列表的比较结果,然后检查是否有匹配项 - 它同时执行abb 到@987654351 @比较。

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 - 见编辑:thnx 我本来打算但被工作打断了。
【解决方案2】:
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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多