如何在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])
关键细节说明
- 集合优化:把
members和non_members转成集合,因为集合的in操作是O(1)时间复杂度,比列表的O(n)效率高很多,尤其当成员/非成员列表较长时。 - 边界控制:
range(len(target_list)-2)确保遍历不会越界,因为我们需要同时检查当前元素和它后面的两个元素。 - 单次插入限制:找到第一个符合条件的位置插入
'1'后,立即用break终止循环,严格保证每个列表最多插入一次。 - 无副作用处理:使用
x.copy()处理列表副本,避免修改原始数据引发意外问题。
运行结果
执行代码后,输出的列表完全符合你的预期:
['AA', '1', 'EEEE', 'GGG', 'FF']
内容的提问来源于stack exchange,提问作者twhale
相关产品推荐
相关产品推荐

