Преобразовать вложенные для-l oop в лямбда-функции для быстрого выполнения - PullRequest
0 голосов
/ 04 февраля 2020

Пример данных

Привет, рамка «Мои данные» выглядит как прикрепленное изображение. Столбец Nbr_Cells представляет собой список объектов. Я пытаюсь добавить еще один столбец во фрейме данных, который является подсписком столбца Nbr_Cells, если отдельный объект заканчивается тем же концом ячейки столбца.

Например,

cellid = U21-A000CH-1A
Nbr_Cells = [U21-MCH001-1A, U21-MCH001-2A, U21-SG0024-1A, U21 -MCH001-2B]

Затем подсписок = [U21-MCH001-1A, U21-SG0024-1A]

, поскольку он заканчивается аналогичным окончанием "1A". Точно так же это должно быть воспроизведено для каждой строки.

Я написал следующий код для l oop, и он работает нормально. Но это занимает много времени, чтобы выполнить. Нужна помощь в преобразовании того же самого в лямбда-функцию или любой подобный код быстрого выполнения.

for j in range(0,len(Overall_list)):
    print(j)
    List = []
    for i in Overall_list['Nbr_Cells'][j]:
        if(i.split("-")[2] == Overall_list['cellid'][j].split("-")[2]):
            List.append(i)
    Overall_list['Sub_Nbr_List'][j] = List

1 Ответ

0 голосов
/ 04 февраля 2020

Основным узким местом в вашем коде является то, что вы оцениваете Overall_list['cellid'][j].split("-")[2] несколько раз, когда вы можете получить это совпадающее значение только один раз за пределами вложенного l oop. Как правило, итерации по элементам быстрее, чем ссылки на элементы по индексу. Кроме того, вы можете использовать понимание списка вместо второго l oop:

for j,list_item in enumerate(Overall_list):
    print(j)
    match = list_item['cellid'].split("-")[2]
    List  = [ i for i in list_item['Nbr_Cells'] if i.split("-")[2] == match ]
    list_item['Sub_Nbr_List'] = List
...