在python列表

时间:2016-04-05 09:57:58

标签: python list search binary-search

我有两个要比较的单词列表。第一个列表是200万字,第二个列表是15万字。我需要做的是应用二进制搜索来查看第一个列表中的单词是否出现在第二个列表中。我正在尝试班轮搜索:

for word in words_list:
    if word in dict_list:
       print(word, 1)
    else:
       print(word, 0)

效果很好,但速度很慢。 然后我尝试了二进制搜索,但它无法正常工作:

for word in wordlist:
    lb = 0
    ub = len(dict_list)
    mid_index = (lb + ub) // 2
    item_at_mid = dict_list[mid_index]
    if item_at_mid == word:
        print(word)
    if item_at_mid < word:
        lb = mid_index + 1
    else:
        ub = mid_index

最后,我需要两个列表第一个字典列表,其中第二个不是。

4 个答案:

答案 0 :(得分:2)

您可以使用套装:

ename,enum

答案 1 :(得分:1)

如果您使用二进制搜索,则应该已经订购了输入。 另一种可能性是将您的words_listdict_list转换为set并获得如下输出:

两者共同的词语:

words_list.intersection(dict_list)

不是另一个词:

words_list-dict_list
dict_list-words_list

答案 2 :(得分:1)

如果你想进行二元搜索:

present = []
absent = []
for word in firstList:
    lb,ub = 0,len(secondList) - 1
    found = False
    while lb <= ub:
        mid = (lb + ub) // 2
        if secondList[mid] == word:
            found = True
            break
        elif secondList[mid] < word:
            lb = mid + 1
        else:
            ub = mid - 1

    if found:
        present.append(word)
    else:
        absent.append(word)

您的二进制搜索代码不正确。

答案 3 :(得分:0)

解决方案是首选使用set而不是列表,因为O(1)操作的__contains__复杂度,如this solution中所述。

如果内存有问题,那么使用bloom filter可能是一个很好的权衡(没有假阴性)。

Here is a python implementation

要创建和维护二叉树,请考虑使用heapq标准模块。