如何检查列表中的元素是否来自给定元素

时间:2019-05-06 20:12:21

标签: python arrays list sorting sequence

我有一个列表,想要检查列表中是否存在给定序列。
例如,给定序列为'a','h','z',列表为l = ['a','b','h','g','z']。鉴于列表z在a之后h之后,我需要代码返回True值。

def check_for_a_h_z(seq):
    return ('a','h','z') in zip(seq, seq[1:], seq[2:])

如果只有'a','h','z'紧跟彼此,则代码返回true。

4 个答案:

答案 0 :(得分:3)

对信封的蛮力尝试是针对两个序列的通用解决方案:

get_templates = SimpleHttpOperator(
    task_id='get_templates',
    method='POST',
    endpoint='myendpoint',
    http_conn_id = 'myconnection',
    trigger_rule="all_done",
    headers={"Content-Type": "application/json"},
    xcom_push=True,
    dag=dag
)

答案 1 :(得分:2)

这是递归的一种方式:

response = input("Please enter your name: ")

if (response == "John"):
    fun_1(something)
else:
    fun_2(something_else)

请注意,我们在下一次迭代的起始索引中使用def list_sequence_recursive(test, lst): if len(test) == 1: return test[0] in lst else: if test[0] in lst: idx = lst.index(test[0]) + 1 # don't send the matched element return list_sequence_recursive(test[1:], lst[idx:]) else: return False test_sequence_recursive(['a', 'h', 'z'], ['a','b','h','g','z']) # True ,因此我们只在匹配后的元素之后发送。如果不使用lst.index(test[0]) + 1,即使您只有一个+ 1,也会错误地将输入列表与['a', 'a', 'h']匹配。

以您的示例为例,

  1. 找到'a',然后使用参数'a'['h', 'z']调用自身
  2. 找到['b','h','g','z'],然后使用参数'h'['z']调用自身
  3. 找到['g', 'z'],然后将'z'返回链条

答案 2 :(得分:2)

在最坏的情况下,如果 True things 中按顺序排列,则将返回seq

O(n)

输出:

def check_for_things(things,seq):
    k = things[:]
    for c in seq:
        if c == k[0]:
            k.pop(0)
        if not k:
            break

    return not k  # if you popped all from k you are done

print( check_for_things(list("ahz"), list('abhgz')))
print( check_for_things(list("ahiz"), list('abhgz')))

它也会为True False 产生True-多余的list("ahz"), list('abhhhhhhhhhhgz')被忽略。


一种更优化的解决方案(由@Aran-Frey建议)将使用deque-在h的末尾弹出元素会很昂贵,因为所有剩余的list数据移了1-O(1)中的list(和popleft)可以使用双端队列:

popright

答案 3 :(得分:-1)

一种有点直观的方法,但不是很Python化:

l=['a','b','h','g','z']

def check_for_a_h_z(seq):
    if 'a' in seq:
        ind=seq.index('a')
        if 'h' in seq[ind:]:
            ind2=seq.index('h')
            if 'z' in seq[ind2:]:
                return True
            else:
                return False
        else:
            return False
    else:
        return False


check_for_a_h_z(l)