【问题标题】:How to check if a list is contained in another list, but taking into account the order [duplicate]如何检查一个列表是否包含在另一个列表中,但要考虑到顺序[重复]
【发布时间】:2021-09-14 10:07:45
【问题描述】:

this question 中有一个关于如何检查一个列表是否包含在另一个列表中的好答案。

但是如何检查一个列表是否包含在另一个列表中但考虑到顺序?

例如

a= [1,2,3,5]
b= [1,2,3,4,5]

if set(a).issubset(b):
    print('a is contained in b')
else:
    print('No')

显然给了我“a包含在b中” 不幸的是,如果 a= [1,3,2,5] 它给了我相同的结果

我想要以下

  • a=[1,3,2,5] -> 否
  • a=[1,2,3,5] -> 是的
  • a=[3,4,5] -> 是的
  • a=[1,2,4,3,5] -> 否
  • a=[1,2,3,4,5] -> 是

【问题讨论】:

  • 作为通用算法:并行迭代两个列表,如果a中的当前项与b相同,则推进两个迭代器,如果它们不同,则只推进b的迭代器。如果以这种方式耗尽a 的迭代器,ab 的子集。如果你先到达b的终点,那不是。
  • 是否包含订单?例如列表 b 为 [1,1,2,3,3,4,6,6,5]。那么在这种情况下 a in b ?
  • this question 可能重复?
  • @KansaiRobot 分享挑战链接?
  • @KansaiRobot 可迭代的通用可迭代解决方案。

标签: python


【解决方案1】:

这有点冗长,但非常直截了当:尝试并行迭代两个列表并将每个项目相互比较。如果它们相同,请转到两个列表的下一项。如果它们不同,则仅继续 b 的迭代器,期望在 b 中有一个附加项。如果你曾经以这种方式到达a 的终点,它就是b 的一个子集。如果你先到达b 的终点,那不是。

def is_subset_in_order(a, b):
    ia, ib = iter(a), iter(b)
    va, vb = next(ia), next(ib)
    
    while True:
        if va == vb:
            try:
                va = next(ia)
            except StopIteration:
                return True
    
        try:
            vb = next(ib)
        except StopIteration:
            return False

b = [1, 2, 3, 4, 5]
assert is_subset_in_order([1, 2, 3, 5], b)
assert not is_subset_in_order([1, 3, 2, 5], b)
assert is_subset_in_order([3, 4, 5], b)
assert not is_subset_in_order([1, 2, 4, 3, 5], b)
assert is_subset_in_order([1, 2, 3, 4, 5], b)
assert is_subset_in_order([1, 1, 2, 2, 3, 3, 1, 1], [1, 1, 2, 5, 2, 3, 42, 3, 1, 1, 6])

【讨论】:

  • 这不适用于空列表。
  • 如果您允许重复值,“子集”听起来不合适。
  • 当任一列表为空时,我将把它留给 OP 是否应该出错。这是有先例的,例如max。是的,好吧,你可能想给它起个别的名字。
  • max 不同,因为空集合根本没有最大值。但对于子序列,空不成问题。
  • 你可以这样说;是包含在另一个序列中的空序列,或者必须至少实际包含一个元素。这是由 OP 决定的业务规则。
【解决方案2】:

试试看:

def IsInList(a:list, b:list):
    for c in a:
        if c in b:
            b = b[b.index(c):]
        else:
            return False
    return True

我试过了:

print(IsInList([1, 3, 2, 5], b))
print(IsInList([1, 2, 3, 5], b))
print(IsInList([3, 4, 5], b))
print(IsInList([1, 2, 4, 3, 5], b))
print(IsInList([1, 2, 3, 4, 5], b))

输出:

False
True
True
False
True

希望有用 诺哈布

【讨论】:

  • 这不适用于重复值。
  • @deceze 再一次,这个问题真的让他们看起来没有重复。他们的例子都没有,而且关于他们使用集合的代码,他们只抱怨顺序。
  • 好!同样对于重复值,将 > 更改为 >= 就足够了
  • @KansaiRobot 不,这还不够。
  • @KansaiRobot 例如仍然会失败IsInList([1, 2, 1], [1, 2, 1])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2012-08-01
  • 2017-01-13
相关资源
最近更新 更多