比较2个Python列表的顺序

cha*_*asm 4 python string list

我正在寻找一些帮助,比较2个Python列表,list1list2的顺序,以检测list2何时出现故障.

  • list1是静态的并包含字符串a,b,c,d,e,f,g,h,i,j.这是"正确的"订单.
  • list2包含相同的字符串,但字符串的顺序和数量可能会更改.(例如a,b,f,d,e,g,c,h,i,ja,b,c,d,e)

我正在寻找一种有效的方法,通过将它与list1进行比较来检测list2何时是我们的订单.

例如,如果列表2a,c,d,e,g,i应该返回true(因为字符串是按顺序)

同时,如果列表2a,d,b,c,e应该返回false(如出现不按顺序串d)

Joh*_*024 7

首先,让我们来定义list1:

>>> list1='a,b,c,d,e,f,g,h,i,j'.split(',')
>>> list1
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
Run Code Online (Sandbox Code Playgroud)

虽然您list1恰好按字母顺序排列,但我们不会假设这一点.此代码无论如何都有效

现在,让我们创建一个list2无序的:

>>> list2 = 'a,b,f,d,e,g,c,h,i,j'.split(',')
>>> list2
['a', 'b', 'f', 'd', 'e', 'g', 'c', 'h', 'i', 'j']
Run Code Online (Sandbox Code Playgroud)

以下是如何测试是否list2出现故障:

>>> list2 == sorted(list2, key=lambda c: list1.index(c))
False
Run Code Online (Sandbox Code Playgroud)

False 意味着无序.

这是一个有序的例子:

>>> list2 = 'a,b,d,e'.split(',')
>>> list2 == sorted(list2, key=lambda c: list1.index(c))
True
Run Code Online (Sandbox Code Playgroud)

True 意味着有序.

忽略list1中不在list2中的元素

让我们考虑一个list2不具有以下元素的元素list1:

>>> list2 = 'a,b,d,d,e,z'.split(',')
Run Code Online (Sandbox Code Playgroud)

要忽略不需要的元素,让我们创建list2b:

>>> list2b = [c for c in list2 if c in list1]
Run Code Online (Sandbox Code Playgroud)

然后我们可以像以前一样测试:

>>> list2b == sorted(list2b, key=lambda c: list1.index(c))
True
Run Code Online (Sandbox Code Playgroud)

替代不使用 sorted

>>> list2b = ['a', 'b', 'd', 'd', 'e']
>>> indices = [list1.index(c) for c in list2b]
>>> all(c <= indices[i+1] for i, c in enumerate(indices[:-1]))
True
Run Code Online (Sandbox Code Playgroud)

  • 所有那些`index`调用都会变得非常昂贵(二次时间!),并且排序是判断输入是否已经排序的低效方法. (3认同)