2014-09-18 105 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])