2014-09-18 96 views
0

我有2所列出:比较列表W /子表

lista = ['1.2.3.4', '2.3.4.5', '3.4.5.6'] # 12,000 IP's 
listb = [['1.2.3.4', 'info', 'moreinfo', 'moremoreinfo'], ['2.3.4.5', 'info', 'moreinfo', 'moremoreinfo']] # 1.8m IP's + info 

我正在寻找一种方式来采取LISTA,如果数组listB的IP exsits,给我所有关于它的信息。

我试过循环,但它的慢得令人难以置信:

for listaitem in lista: 
    for listbitem in listb: 
     if listaitem in listbitem[0]: 
      print listbitem 

上的任何suggetions如何加快这个呢?

回答

3

你可以把lista成为一个集快速成员测试,则刚刚超过listb循环选择任何在lista发现:

lista_set = set(lista) 
for item in listb: 
    if item[0] in lista_set: 
     print item 

下一步正在转向listb成词典:

listb_dict = {item[0]: item[1:] for item in listb} 

现在您可以使用套件挑选出只需那些既在lista_set也在listb_dict

for match in listb_dict.viewkeys() & lista_set: 
    print match, listb_dict[match] 
+0

太棒了谢谢你! – Sugitime 2014-09-18 22:56:46

1
lista = ['1.2.3.4', '2.3.4.5', '3.4.5.6'] 
listb = [['1.2.3.4', 'info', 'moreinfo', 'moremoreinfo'], 
     ['2.3.4.5', 'info', 'moreinfo', 'moremoreinfo']] 

打开listb成字典

dictb = {i[0] : i[1:] for i in listb} 

遍历lista并查找条目dictb

for elem in lista: 
    print dictb.get(elem) 

['info', 'moreinfo', 'moremoreinfo'] 
['info', 'moreinfo', 'moremoreinfo'] 
None 
1

你应该将数据转换为更适合的格式用于搜索:字典。

ip_info = {info[0]: info[1:] for info in listb} 

然后,您可以非常快速地查询有关特定IP的信息。

for ip in lista: 
    if ip in ip_info: 
     print(ip_info[ip])