Python嵌套列表

Python嵌套列表,python,list,nested,iteration,Python,List,Nested,Iteration,我试图交叉检查两个嵌套的列表值,如果得到匹配项,则将列表1中的值附加到列表2中 比如, 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][

我试图交叉检查两个嵌套的列表值,如果得到匹配项,则将列表1中的值附加到列表2中

比如,

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
我知道上面的说法是错误的,我正在努力找出如何在遍历列表2的同时访问列表1的值。原因是我需要检查每一行,然后检查该行的值,然后修改该行中的特定值

感谢您的快速响应

我已尝试实现给定的代码,但在尝试从列表中创建措辞时遇到了问题:

哇,你们这些家伙

    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

有什么想法吗?

我想这很好,它的时间复杂度只有+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对目标进行迭代。如果列表2中有很多项不需要修改,它们被跳过,那么它可能会有一点优势

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]

你有具体的问题吗?如果是这样,请编辑您的帖子并加入您的问题。列表2的顺序可以更改吗?仅供参考,但是如果列表中的元素在质量上是异构的,那么它可能不应该是一个列表。列表的顺序并不重要,只需检查每个IP并将值作为nesc插入。我最初的回答需要一个包含两个元素的列表,您的参数似乎以某种方式交换了,也许也应该交换参数?我应该避免mydic中的双重查找,而是使用一个变量。甚至是一个小的mydic;说到点子上,我希望mydic足够大,值得费心。。但是我应该如何在不捕获异常的情况下做到这一点呢?我觉得这不是一个正确的方法…见顶部的回应。这正是我想要的。我真的把事情复杂化了,弄糊涂了。谢谢。这很容易理解,但是如果两个列表都足够大的话,速度会慢得多。埃米利亚诺是正确的。如果您没有任何多次出现的问题,请使用字典。大家同意,谢谢。我只是简单地从两个csv读取数据并输出到一个新的csv,只有几百个IP需要检查。它也只会做一次,所以没有必要使它花哨