You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python列表中满足成员后接两个非成员时插入'1'?

解决方法

我来帮你搞定这个问题!核心思路是先写一个处理单个列表的函数,找到第一个满足「成员元素后紧跟两个连续非成员元素」的位置插入'1',且只插一次,之后把这个函数批量应用到DataFrame的对应列上。

完整代码示例

import pandas as pd

members = ['AA', 'BBB', 'CC', 'DDDD']
non_members = ['EEEE', 'FF', 'GGG', 'HHHHH', 'III', 'JJ']
s = ['AA', 'EEEE', 'GGG', 'FF']
df = pd.DataFrame({'string':[s]})

def insert_one(target_list, members_set, non_members_set):
    # 转成集合提升in操作的效率(数据量大时优势明显)
    mem_set = set(members_set)
    non_mem_set = set(non_members_set)
    # 遍历列表,寻找第一个符合条件的位置
    for i in range(len(target_list) - 2):
        if (target_list[i] in mem_set 
            and target_list[i+1] in non_mem_set 
            and target_list[i+2] in non_mem_set):
            # 在成员元素的下一个位置插入'1'
            target_list.insert(i+1, '1')
            break  # 只插入一次,找到后立即退出循环
    return target_list

# 对DataFrame的string列应用函数,用copy避免修改原始列表
df['string'] = df['string'].apply(lambda x: insert_one(x.copy(), members, non_members))

print(df['string'].iloc[0])

关键细节说明

  1. 集合优化:把members和non_members转成集合,因为集合的in操作是O(1)时间复杂度,比列表的O(n)效率高很多,尤其当成员/非成员列表较长时。
  2. 边界控制:range(len(target_list)-2)确保遍历不会越界,因为我们需要同时检查当前元素和它后面的两个元素。
  3. 单次插入限制:找到第一个符合条件的位置插入'1'后,立即用break终止循环,严格保证每个列表最多插入一次。
  4. 无副作用处理:使用x.copy()处理列表副本,避免修改原始数据引发意外问题。

运行结果

执行代码后,输出的列表完全符合你的预期:

['AA', '1', 'EEEE', 'GGG', 'FF']

内容的提问来源于stack exchange,提问作者twhale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:50:09