2015-06-08 232 views
-3

我想交叉检查两个嵌套列表值,如果我得到一个匹配,将list1中的值附加到list2中。Python - 嵌套列表

例如;

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,如果是这样,与List1[x][1]取代List2[x][3]值。

我正在尝试的是;

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。原因是因为我需要检查每一行,然后检查该行的值,然后修改该行内的特定值。

感谢您的RAPID回应!

我试图实现给定的代码,但试图从我的列表中创建一个词时,我遇到了麻烦:

哇,你们这些家伙!

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 

任何想法?

+1

您有具体问题?如果是这样,请编辑您的帖子并包含您的问题。 –

+0

可以'''list2'''命令改变吗? – wwii

+0

只是FYI,但如果'list'内的元素在质量上是异构的,那么它可能不应该是'list'。 – TigerhawkT3

回答

1

假设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']] 
+0

正是我在找的东西。我严重过分复杂化,并感到困惑。谢谢。 – rayd44

+0

这很容易理解,但如果两个列表都足够大,它可能会慢得多。 – Dleep

+0

Emiliano的立场正确。如果您没有任何多次出现来替换使用字典。 – Pynchia

2

这工作正常,我猜,其时间复杂度只有O(n + m)与n和m是每个列表的长度。

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

作为一个侧面说明,我不能帮助命名我的字典:“mydic”由于某种原因... – Dleep

+0

我会避免在mydic中的双重查找和使用变量。即使这是一个小mydic ...;) – Pynchia

+0

点采取,我希望mydic是足够大的值得麻烦,虽然..但我应该怎么做,而不必捕捉异常?我觉得这不是一个正确的方法... – Dleep

0

排序上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]