如果我有这个:
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
我可以通过处理数据来得到我想要的东西--但是有没有一种简短的Python方法来做到这一点呢?
澄清一下:我需要保留这里的顺序(B=['e','d'],应该返回False)。
如果有帮助的话,我有一个清单:这些列表表示有向图中从节点1到节点X的所有可能路径(被访问节点的列表):我想在任何较长的路径中“分解”出公共路径。(所以寻找所有组成所有较长路径的不可约的“原子”路径)。
9条答案
按热度按时间gr8qqesn1#
我怀疑还有更多的Python式的方法来做这件事,但至少它完成了工作:
vwhgwdsa2#
不知道这是不是很Python,但我会这样做:
在discussion中提供了更短的解决方案,但它遇到了与
set
解决方案相同的问题-它不考虑元素的顺序。最新消息:
受MAK的启发,我引入了更简洁明了的代码版本。
UPDATE:由于在切片中复制列表,因此此方法存在性能问题。此外,由于它是递归的,因此可能会遇到长列表的递归限制。若要消除复制,可以使用Numpy切片(creates views, not copies)。如果遇到性能或递归限制问题,则应使用不带递归的解决方案。
nbysray53#
我认为这会更快-它使用C实现
list.index
来搜索第一个元素,然后从那里开始。请注意,它返回的是子列表在列表中的位置,而不仅仅是
True
或False
。如果只需要bool
,可以使用以下语句:mlnl4t2r4#
我对已接受的解决方案、我之前的解决方案和一个有索引的新解决方案进行了计时。有索引的解决方案显然是最好的。
编辑:我计算了Nosklo的解决方案,它甚至比我想出来的要好得多。:)
以秒为单位的输出:
4.51677298546
4.5824368
1.87861895561
0.357429027557
ddarikpa5#
因此,如果您不关心子集的显示顺序,则可以执行以下操作:
澄清后进行编辑:如果你需要保持顺序,并且列表中确实是你问题中的字符,你可以用途:
8fsztsew6#
这应该适用于任何一对列表,并保持顺序。检查 B 是否是 a 的子列表
w80xi6nr7#
5hcedyr08#
不确定您的应用程序有多复杂,但对于列表中的模式匹配,pyparsing非常智能和易于使用。
vsmadaxz9#
使用列表的字符串表示并删除方括号。:)
编辑:对,有误报... eidogg.
is_sublist([1], [11])
.蹩脚的答案。:)