如何对列表元素分组并筛选满足±10差值条件的元素?
问题与解决方案
问题背景
给定原始列表:
my_list = [18, 19, 20, 27, 28, 29, 38, 39, 40]
需先拆分为3个长度为3的子列表:
list1 = [18, 19, 20] list2 = [27, 28, 29] list3 = [38, 39, 40]
然后保留满足以下跨组±10条件的元素:
- list1的元素x:存在list2或list3中的元素y,使得
x = y-10或x = y+10 - list2的元素x:存在list1或list3中的元素y,使得
x = y-10或x = y+10 - list3的元素x:存在list1或list2中的元素y,使得
x = y-10或x = y+10
最终期望结果:
final = [18,19,28,29,38,39]
失败的尝试代码
尝试N1
for lst in my_list: ind = my_list.index(lst) if int(my_list[ind]) == any(int(x)-10 for x in my_list) or int(my_list[ind]) == any(int(x)+10 for x in my_list): print(ind)
尝试N2
for id in my_list: ind = my_list.index(id) try: if id == (my_list[ind+1])-1 and id : print(id) except IndexError: print("out of", id)
正确实现方案
步骤1:拆分原始列表为指定分组
my_list = [18, 19, 20, 27, 28, 29, 38, 39, 40] # 按每3个元素拆分分组 list1, list2, list3 = [my_list[i:i+3] for i in range(0, len(my_list), 3)]
步骤2:预生成跨组±10的集合(提升判断效率)
# 生成各列表元素±10的集合,用于快速成员判断 list1_plus10 = {num + 10 for num in list1} list1_minus10 = {num - 10 for num in list1} list2_plus10 = {num + 10 for num in list2} list2_minus10 = {num - 10 for num in list2} list3_plus10 = {num + 10 for num in list3} list3_minus10 = {num - 10 for num in list3}
步骤3:筛选符合条件的元素并合并
# 筛选list1中符合条件的元素 filtered_list1 = [x for x in list1 if x in list2_minus10 or x in list3_minus10 or x in list2_plus10 or x in list3_plus10] # 筛选list2中符合条件的元素 filtered_list2 = [x for x in list2 if x in list1_minus10 or x in list3_minus10 or x in list1_plus10 or x in list3_plus10] # 筛选list3中符合条件的元素 filtered_list3 = [x for x in list3 if x in list1_minus10 or x in list2_minus10 or x in list1_plus10 or x in list2_plus10] # 合并得到最终结果 final = filtered_list1 + filtered_list2 + filtered_list3 print(final) # 输出: [18, 19, 28, 29, 38, 39]
失败代码问题分析
- 尝试N1:错误地将整数和
any()返回的布尔值做相等判断,any()只会返回True/False,无法和元素值匹配。正确逻辑是判断元素是否存在于目标±10的集合中。 - 尝试N2:逻辑完全偏离需求,仅检查当前元素与下一个元素的连续关系,和跨组±10的判断无关。
内容的提问来源于stack exchange,提问作者Bary Simmons
相关产品推荐
相关产品推荐

