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]
我正在尝试交叉检查两个嵌套列表值,如果找到匹配项,则将值从 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]