2014-09-18 6 views
0

У меня есть 2 списка:Список сравнения ж/подсписка

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, если IP exsits в-листB, дайте мне всю информацию о нем.

Я попытался зацикливание, но его невероятно медленно:

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

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']] 

Turn 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]) 
Смежные вопросы