Python - 嵌套列表

Python - Nested Lists

我正在尝试交叉检查两个嵌套列表值,如果找到匹配项,则将值从 list1 追加到 list2 中。

例如;

list1 = [[ip, hostname], [ip, hostname], [ip, hostname]]
list2 = [[ip, ip_upper, type, hostname, location], [ip, ip_upper, type, hostname, location], [ip, ip_upper, type, hostname, location]]

我想检查list1[x][0]中的值是否在list2中,如果是,将List2[x][3]中的值替换为List1[x][1]

我正在尝试的是;

count = 0;
for row in list2:
    if row[0] in hosts[count][0]:
        new_hostname = hosts[count][1]
        row[4].append(new_hostname)
        count += 1
    else:
         continue
         count += 1

我知道以上是不正确的,我正在努力弄清楚如何在遍历 list2 的同时访问值 list1。原因是因为我需要检查每一行,然后检查该行的值,然后修改该行内的特定值。

感谢您的快速回复!

我已经尝试实现给定的代码,但是在尝试从我的列表中创建字典时 运行 遇到了麻烦:

哇,你们!

    def doStuff(list1, list2):
        mydic = dict(list2)
        for l in list1:
            l[3] = mydic.get(l[0], l[3])
        return mydic

new_dic = doStuff(hostname, old_rows) 

我收到错误;

    mydic = dict(list2)
ValueError: dictionary update sequence element #0 has length 6; 2 is required

有什么想法吗?

我猜这很好用,它的时间复杂度仅为 O(n + m),其中 n 和 m 是每个列表的长度。

def doStuff(list1, list2):
    mydic = dict(list1)
    for l in list2:
        l[3] = mydic.get(l[0], l[3])

假设ip字段值支持相等比较(==),这个方案或许能帮到你。它非常简单和蹩脚,可能不是很优化,但它有效。

注意:它适用于 list2 中 list1 的每个元素的每次出现,因此如果您在 list2 中有多个匹配项,它们都会得到更新。

list1 = [['1.2.3.4', 'ciao.com'],
         ['1.2.3.5', 'prova.net'],
         ['1.2.2.2', 'uovo.net']]
list2 = [['1.2.3.4', '1.2.3.x', 'type', 'xyz.com', 'puglia'],
         ['1.2.3.7', '1.2.3.x', 'type', 'zyx.com', 'lazio'],
         ['1.2.3.5', '1.2.3.x', 'type', 'yxz.com', 'molise']]

print list1
print list2

for i in list1:
    ip = i[0]
    for j in list2:
        cur_ip = j[0]
        if ip == cur_ip:
            j[3] = i[1]

print list2

输出:

[['1.2.3.4', 'ciao.com'], ['1.2.3.5', 'prova.net'], ['1.2.2.2', 'uovo.net']]
[['1.2.3.4', '1.2.3.x', 'type', 'xyz.com', 'puglia'], ['1.2.3.7', '1.2.3.x', 'type', 'zyx.com', 'lazio'], ['1.2.3.5', '1.2.3.x', 'type', 'yxz.com', 'molise']]
[['1.2.3.4', '1.2.3.x', 'type', 'ciao.com', 'puglia'], ['1.2.3.7', '1.2.3.x', 'type', 'zyx.com', 'lazio'], ['1.2.3.5', '1.2.3.x', 'type', 'prova.net', 'molise']]

ip 上对目标列表进行排序,然后使用 itertools.groupby 迭代目标。如果list2中有很多项不需要修改(跳过),它可能会有点优势。

import operator, itertools
ip = operator.itemgetter(0)
keys = dict(list1)
list2.sort(key = ip)
for key, group in itertools.groupby(list2, ip):
    if key in keys:
        for item in group:
            item[3] = keys[key]