Как заполнить список в python на основе другого списка, который содержит некоторые значения из третьего списка? - PullRequest
1 голос
/ 13 июля 2020

python чел. Я искал свой вопрос на многих форумах, но не нашел достаточно хорошего ответа. У меня следующая ситуация: представьте, что у меня есть list1 с идентификаторами пользователей и list2 с их именами. У меня также есть list3 с некоторыми идентификаторами пользователей (из list1 ), и я хочу создать list4 с именами из list2 . Я знаю, что могу легко найти их имена с помощью идентификатора поиска for l oop по идентификатору в list3 и найти имя пользователя из list2, но мне нужна скорость, потому что я работаю с миллионами строк. Вот мой фрагмент кода:

for userID in list3:
    index = [i for i, x in enumerate(list1) if x == userID]
    list4.append(list2[index])

Итак, мой вопрос: есть ли более быстрый подход к этой проблеме?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Допустим, list1, ..., list4 имеет длину n1, ..., n4. Линейное сканирование идентификаторов в списке 3 имеет сложность O (n1 * n3).

Альтернативный подход - создать словарь подстановки из list1 и list2. В этом случае сложностью будет создание словаря + поиск, то есть O (n1) + O (n3).

id2name = dict(zip(list1, list2))    
list4 = [id2name[id] for id in list3]

В большинстве случаев (кроме очень коротких списков 3, 0 или 1 длины) будет быстрее, чем линейное сканирование

1 голос
/ 13 июля 2020

Вы можете использовать index() функцию списка.

for userID in list3:
    list4.append(list2[list1.index(userID))

Надеюсь, это ускорит ваш код

...