Python:在另一个列表的成员中查找列表(按顺序)

新手上路,请多包涵

如果我有这个:

 a='abcdefghij'
b='de'

然后在 a 中找到 b:

 b in a => True

有没有办法用列表做类似的事情?像这样:

 a=list('abcdefghij')
b=list('de')

b in a => False

‘False’ 结果是可以理解的 - 因为它正确地寻找元素 ‘de’,而不是(我碰巧希望它做的)’d’ 后跟 ‘e’

这是有效的,我知道:

 a=['a', 'b', 'c', ['d', 'e'], 'f', 'g', 'h']
b=list('de')
b in a => True

我可以处理数据以获得我想要的东西——但是有没有一种简短的 Pythonic 方法可以做到这一点?

澄清一下:我需要保留此处的顺序(b=[‘e’,’d’],应返回 False)。

如果有帮助,我有一个列表列表:这些列表代表有向图中从 node-1 到 node-x 的所有可能路径(访问节点列表):我想“分解”出常见路径任何更长的路径。 (因此寻找构成所有较长路径的所有不可简化的“原子”路径)。

有关的

原文由 monojohnny 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 265
2 个回答

不知道这是否非常 pythonic,但我会这样做:

 def is_sublist(a, b):
    if not a: return True
    if not b: return False
    return b[:len(a)] == a or is_sublist(a, b[1:])

本次 讨论 中提供了较短的解决方案,但它与 set 的解决方案存在相同的问题 - 它不考虑元素的顺序。

更新:

受 MAK 的启发,我引入了更简洁明了的代码版本。

更新:由于切片中的列表复制,此方法存在性能问题。此外,由于它是递归的,您可能会遇到长列表的递归限制。要消除复制,您可以使用创建视图的 Numpy 切片 ,而不是副本。如果您遇到性能或递归限制问题,您应该使用没有递归的解决方案。

原文由 Rorick 发布,翻译遵循 CC BY-SA 4.0 许可协议

我怀疑有更多的 pythonic 方法可以做到这一点,但至少它完成了工作:

 l=list('abcdefgh')
pat=list('de')

print pat in l # Returns False
print any(l[i:i+len(pat)]==pat for i in xrange(len(l)-len(pat)+1))

原文由 MAK 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题