<p>另一种欺骗很小的方法是使用带有<code>in</code>运算符的字符串。如果将每个列表转换为一个字符串,则可以快速查看a是否是B的一个子串,顺序相同且连续<strong>。你知道吗</p>
<pre><code>def aInB(listA, listB):
str_a = "," + ",".join([str(c) for c in listA]) + ","
# ',1,2,3,66,0,'
str_b = "," + ",".join([str(c) for c in listB]) + ","
# ',0,0,1,2,3,66,0,99,0,3,'
return str_a in str_b
# True
</code></pre>
<p>只有当A的长度小于B时,这才有效,但根据问题的定义,这听起来总是正确的。额外的逗号是必要的,因为@stefanpochmann在评论中指出了问题。你知道吗</p>
<p>打印“是”和“否”非常简单:</p>
<pre><code>if aInB(listA, listB):
print("YES")
else:
print("NO")
</code></pre>
<p>对于非连续方法,我相信您必须执行其中一种迭代方法。这个解决方案只是提供了一种思考is“A in B”的替代方法。你知道吗</p>
<p>编辑:我无法控制自己,所以这里有一个互动的方法,这可能是一种过度的方式,但也许你会发现它更容易理解(你永远不知道)。你知道吗</p>
<pre><code>def aInB(listA, listB):
# if listA is empty, don't even bother
if not listA:
return False
# build a dictionary where each key is a character in listA
# and the values are a list containing every index where that character
# appears in listB
occurences = {c:[i for i,e in enumerate(listB) if e==c] for c in listA}
# now we are going to walk through listA again
# but this time we are going to use our `occurences` dictionary
# to verify that the elements appear in order
last_index = 0
for i,e in enumerate(listA):
# if the character `e` never appears in listB
# then it will have an empty list
# and we can return False
if not occurences[e]:
return False
# now the next possible index for the next character in listA
# must be *greater* than the index of the last character we found
# if no such index exists, then listA is not contained within listB
# if it is, we update the last seen index
next_possible_index = [x for x in occurences[e] if x > last_index]
if not next_possible_index:
return False
last_index = next_possible_index[0]
# if we make it out of the for loop
# then all is well, and listA is contained in listB
# but not necessarily consequtively
return True
</code></pre>