将列表与/ sublist进行比较

时间:2014-09-18 22:36:52

标签: python

我有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在listb中存在,请给我所有信息。

我尝试过循环,但速度非常慢:

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

关于如何提高速度的任何建议?

3 个答案:

答案 0 :(得分: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_setlistb_dict中的

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

答案 1 :(得分: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

答案 2 :(得分: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])