首页 > 解决方案 > 将嵌套的 for 循环转换为 lambda 函数以快速执行

问题描述

样本数据

嗨,我的数据框看起来像附加的图像。Nbr_Cells 列是一个对象列表。我正在尝试在数据框中添加另一列,该列是 Nbr_Cells 列的子列表,如果单个对象以列 cellid 的相同结尾结尾。

例如,

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”结尾。同样,这必须为每一行复制。

我用 for 循环编写了以下代码,并且工作正常。但是执行起来需要很多时间。需要帮助将其转换为 lambda 函数或任何类似的快速执行代码。

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

标签: pythonperformancelambdanested-loops

解决方案


代码中的主要瓶颈是,Overall_list['cellid'][j].split("-")[2]当您只能在嵌套循环之外获得一次匹配值时,您正在多次评估。迭代项目通常比按索引引用项目更快。此外,您可以使用列表推导而不是第二个循环:

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

推荐阅读