首页 > 解决方案 > 如何使用for循环返回列表的最后一个元素

问题描述

我需要根据这个列表从每一行中提取最后一个字符:

lst = [ '-ae-' , '-ap-' , '-vn-' , '-au-' , '-aw-' , '-be-' , '-bp-' , '-br-' , '-dz-' ]

这里是一个示例df['CN']

1: aes-sof-mar-goo-wh-en-ap-bro-sear-vn-loc
2: aes-br-mar-goo-ww-en-dz-bp-cen 
3: aes-apt-au-goo-vn-en-br-bp

我使用了这段代码:

def param(df):
    lst = ['-ae-','-ap-','-vn-','-au-','-aw-','-be-','-bp-','-br-', '-dz-']
    for x in lst: 
        if x in df['CN']:
            return x

df['budget'] = df.apply(param, axis=1)

我需要返回列表中看到的最后一个元素:

1: -vn-
2: -bp-
3: -bp-

但我的代码返回了每行交叉的第一个元素:

1: -ap-
2: -br-
3: -au-

标签: pythonpython-3.xpandasjupyter

解决方案


用于rfind查找最右边的出现。用于max查找最右边最右边的出现。lst此代码假定将找到至少一个成员;如果没有找到,它lst无论如何都会返回一个成员。

def param(df):
    lst = ['-ae-','-ap-','-vn-','-au-','-aw-','-be-','-bp-','-br-', '-dz-']
    return max(lst, key=lambda x: rfind(df, x))

这更长,但会None在有意义时返回:

def param(df):
    lst = ['-ae-','-ap-','-vn-','-au-','-aw-','-be-','-bp-','-br-', '-dz-']
    pos = [(rfind(df, x), x) for x in lst]
    if not pos: return None
    m = max(pos)
    if m[0] == -1: return None
    return m[1]

推荐阅读