如何使用for循环返回列表的最后一个元素

时间:2019-06-03 09:43:30

标签: python python-3.x pandas jupyter

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

<DataGridComboBoxColumn ItemsSource="{Binding Names}" SelectedItemBinding="{Binding Name}" />

这里是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-

3 个答案:

答案 0 :(得分:1)

使用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]

答案 1 :(得分:1)

使用series.str.findall()series.str()的熊猫方式:

pat=r'(?=({}))'.format('|'.join(re.escape(x) for x in lst))# @thanks Amadan
#'(?=(\\-ae\\-|\\-ap\\-|\\-vn\\-|\\-au\\-|\\-aw\\-|\\-be\\-|\\-bp\\-|\\-br\\-|\\-dz\\-))'
df['CN'].str.findall(pat).str[-1]

0    -vn-
1    -dz-
2    -br-

答案 2 :(得分:1)

使用np.in1d

l = [i.replace('-','') for i in lst]
df['CN'].apply(lambda x: '-'+ np.array(l)[np.in1d(l,x.split('-'))][-1] + '-')

输出

0    -vn-
1    -dz-
2    -br-