найти общий индекс в списке двух питонов, который существует в третьем списке - PullRequest
0 голосов
/ 23 июня 2019

У меня есть три списка Python: list_a, list_b и list_c. Длина list_a и list_b составляет около 10000. Элементами в двух списках являются String. Длина list_c составляет около 1000. И все элементы list_c существуют в list_a. Я хочу найти все те же индексы i, что list_a[i] in list_c и list_b[i] in list_c.


list_a = create_list_a()
list_b = create_list_b()
length = len(list_a)
result = []

for j in range(1000000):
    list_c = get_list_c(some_arguments)
    tmp = [i for i in range(length) if list_a[i] in list_c and list_b[i] in list_c]
    result.append(tmp)

Кусок кода работает медленно. Есть ли способ улучшить скорость этого кода. Кстати, может ли фильтр Блума подойти для этого вопроса?

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Изготовление list_c комплект:

set_c = set(list_c)
result = [i for i, (a, b) in enumerate(zip(list_a, list_b)) if a in set_c and b in set_c]
0 голосов
/ 24 июня 2019

У вас есть два больших списка, которые мало обновляются, так что вы можете создать словарь для них, чтобы избежать необходимости искать их наивно. Вместо этого вы можете перебирать list_c, который меньше, и запрашивать их, используя словари. Для каждой итерации, которая создается list_c, вы находите набор индексов в list_a и list_b и вычисляете их пересечение в tmp и добавляете его к результату. Я попробовал этот подход, и код работает относительно намного быстрее. Я добавил индикатор, чтобы увидеть, как быстро работает код.

dict_a = dict()
for i,l in enumerate(list_a):
    if l not in dict_a.keys():
        dict_a[l] = []
    dict_a[l].append(i)
dict_b = dict()
for i,l in enumerate(list_b):
    if l not in dict_b.keys():
        dict_b[l] = []
    dict_b[l].append(i)

for j in range(1000000):
    if (j % 10000)==0:
        print('progress = ', int(100*j/1e6), '%')
    list_c = get_list_c(some_arguments)
    indices1 = []
    indices2 = []
    for l in list_c:
        if l not in dict_a.keys():
            s1 = []
        else:
            s1 = dict_a[l]
        if l not in dict_b.keys():
            s2 = []
        else:
            s2 = dict_b[l]
        indices1.extend(s1)
        indices2.extend(s2)
    indices1 = set(indices1)
    indices2 = set(indices2)
    tmp = list(indices1.intersection(indices2))
    result.append(tmp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...