比较序列 Python
Compare Sequences Python
python 中有没有一种方法可以比较列表中的 2 个序列,即使它们没有标准化(我认为这是正确的词)。例如:
a = [1,1,2,3,3,1,5]
b = [2,3,3,1,5,1,1]
c = [1,1,1,2,3,3,5]
a == b
应该 return 正确,因为它们包含相同的序列,只是起点不同。
c == a
应该 return False 因为尽管它们包含相同的元素,但它们不包含相同的序列
我唯一能做的就是有点不雅。我会比较 2 个列表,如果它们不相等,则将列表的最后一个元素移到前面并再次比较。重复此操作,直到我将整个列表移动一次。但是,我将处理一些非常大的列表,因此效率非常低
这可能比移动元素更有效:
>>> a = [1, 1, 2, 3, 3, 1, 5]
>>> b = [2, 3, 3, 1, 5, 1, 1]
>>> c = [1, 1, 1, 2, 3, 3, 5]
>>> astr, bstr, cstr = ["".join(map(str, x)) for x in (a, b, c)]
>>> astr in bstr*2
True
>>> cstr in astr*2
False
它所做的基本上是 join
字符串列表并检查第一个字符串是否包含在另一个 'doubled'.
使用字符串可能是最快的,并且应该适用于像 OP 中这样的简单情况。作为一种更通用的方法,您可以将相同的想法应用于列表切片,例如:
>>> any(idx for idx in range(len(a)) if (b*2)[idx:idx+len(a)] == a)
True
python 中有没有一种方法可以比较列表中的 2 个序列,即使它们没有标准化(我认为这是正确的词)。例如:
a = [1,1,2,3,3,1,5]
b = [2,3,3,1,5,1,1]
c = [1,1,1,2,3,3,5]
a == b
应该 return 正确,因为它们包含相同的序列,只是起点不同。
c == a
应该 return False 因为尽管它们包含相同的元素,但它们不包含相同的序列
我唯一能做的就是有点不雅。我会比较 2 个列表,如果它们不相等,则将列表的最后一个元素移到前面并再次比较。重复此操作,直到我将整个列表移动一次。但是,我将处理一些非常大的列表,因此效率非常低
这可能比移动元素更有效:
>>> a = [1, 1, 2, 3, 3, 1, 5]
>>> b = [2, 3, 3, 1, 5, 1, 1]
>>> c = [1, 1, 1, 2, 3, 3, 5]
>>> astr, bstr, cstr = ["".join(map(str, x)) for x in (a, b, c)]
>>> astr in bstr*2
True
>>> cstr in astr*2
False
它所做的基本上是 join
字符串列表并检查第一个字符串是否包含在另一个 'doubled'.
使用字符串可能是最快的,并且应该适用于像 OP 中这样的简单情况。作为一种更通用的方法,您可以将相同的想法应用于列表切片,例如:
>>> any(idx for idx in range(len(a)) if (b*2)[idx:idx+len(a)] == a)
True