Python:在循环列表中查找上一个和下一个'True'元素
给定循环列表中的当前索引,查找上一个Python:在循环列表中查找上一个和下一个'True'元素,python,Python,给定循环列表中的当前索引,查找上一个True元素的最佳方法是什么 例如,给定如下数据 my_list=['a','b','c','d','e','f','g'] 我的列表条件=[0,0,1,1,0,1,1] 查找上一个元素 before\u e=find\u prev('e',我的\u列表,我的\u列表\u条件) #在我们应该被“d”之前 before_c=find_prev('c',my_list,my_list\u条件) #before_c应该是“g”,因为它是循环列表,c之前的第一个Tr
True
元素的最佳方法是什么
例如,给定如下数据
my_list=['a','b','c','d','e','f','g']
我的列表条件=[0,0,1,1,0,1,1]
before\u e=find\u prev('e',我的\u列表,我的\u列表\u条件)
#在我们应该被“d”之前
before_c=find_prev('c',my_list,my_list\u条件)
#before_c应该是“g”,因为它是循环列表,c之前的第一个True元素是g
after_e=find_next('e',我的_列表,我的_列表条件)
#之后,e应输出“f”
在\u g=查找下一步(“g”、我的\u列表、我的\u列表\u条件)之后
#after_g应该输出'c',因为它是循环列表,c之后的第一个True元素是g
您可以使用itertools.cycle
和itertools.compress
查找下一个元素,确保循环并仅循环所需的项目,但确保保留条件中的元素,一旦完成,则查找上一个元素只是反向查找下一个元素:
from itertools import cycle, compress
def find_next(c, lst, lst_condition):
condition = lst_condition[:]
condition[lst.index(c)] = 1
elems = cycle(compress(lst, condition))
for elem in elems:
if elem == c:
return next(elems)
def find_prev(c, lst, lst_condition):
return find_next(c, list(reversed(lst)), list(reversed(lst_condition)))
测试:
另一个例子:
from functools import partial
my_list = ["a", "b", "c", "d", "e", "f", "g"]
my_list_condition = [0, 0, 1, 1, 0, 1, 1]
def find_next(element, element_list, condition_list, backward=False):
step = -1 if backward else 1
next_index = element_list.index(element) + step
length = len(element_list)
while True:
if next_index < 0 or next_index >= length:
next_index = (next_index + length) % length
if condition_list[next_index]:
return element_list[next_index]
next_index += step
find_prev = partial(find_next, backward=True)
print(find_prev("e", my_list, my_list_condition))
# d
print(find_prev("c", my_list, my_list_condition))
# g
print(find_next("e", my_list, my_list_condition))
# f
print(find_next("g", my_list, my_list_condition))
# c
从functools导入部分
我的清单=[“a”、“b”、“c”、“d”、“e”、“f”、“g”]
我的列表条件=[0,0,1,1,0,1,1]
def find_next(元素、元素列表、条件列表,向后=False):
步骤=-1(如果向后),否则为1
下一个索引=元素列表。索引(元素)+步骤
长度=长度(元素列表)
尽管如此:
如果下一个索引<0或下一个索引>=长度:
下一个索引=(下一个索引+长度)%length
如果条件列表[下一个索引]:
返回元素列表[下一个索引]
下一个索引+=步骤
find_prev=partial(find_next,backward=True)
打印(查找上一页(“e”,我的列表,我的列表条件))
#d
打印(查找上一页(“c”,我的列表,我的列表条件))
#g
打印(查找下一步(“e”,我的列表,我的列表条件))
#f
打印(查找下一步(“g”,我的列表,我的列表条件))
#c
迭代字符串,一旦超过len(my_list)-1,将索引重置为0
您还可以提供一些您尝试过的代码,谢谢@Jab。我真的很喜欢你的解决方案
from functools import partial
my_list = ["a", "b", "c", "d", "e", "f", "g"]
my_list_condition = [0, 0, 1, 1, 0, 1, 1]
def find_next(element, element_list, condition_list, backward=False):
step = -1 if backward else 1
next_index = element_list.index(element) + step
length = len(element_list)
while True:
if next_index < 0 or next_index >= length:
next_index = (next_index + length) % length
if condition_list[next_index]:
return element_list[next_index]
next_index += step
find_prev = partial(find_next, backward=True)
print(find_prev("e", my_list, my_list_condition))
# d
print(find_prev("c", my_list, my_list_condition))
# g
print(find_next("e", my_list, my_list_condition))
# f
print(find_next("g", my_list, my_list_condition))
# c