我有一个列表,想要检查列表中是否存在给定序列。
例如,给定序列为'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。
答案 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']
匹配。
以您的示例为例,
'a'
,然后使用参数'a'
和['h', 'z']
调用自身['b','h','g','z']
,然后使用参数'h'
和['z']
调用自身['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)