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