微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于序列弱序的列表比较

如何解决基于序列弱序的列表比较

我试图找出一种方法检查元素序列中是否存在顺序。 例如:

orderExists = [
    ['a','c','d','e'],['b','f'],['a','b','e']
]
orderViolation = [
    ['a','e','b']
]

存在顺序是因为有效序列应类似于 a,b,c,d,e,f在子列表中元素可能不存在。 例如,在 orderExists[0] = ['a','e'] 中,bf 不存在,但只要 c 出现在 a 之后且在 d 之前,就会遵守顺序。

违反了顺序,因为在 orderViolation[2] = ['a','b'] 中,e 不应在 c 之前。

这也是一个测试用例,我不知道有效的序列,我唯一拥有的是上面例子中的子列表列表。

有没有什么有效的方法可以判断是否存在订单?

注意:子列表不仅仅包含按字母顺序排列的元素。

例如:纽约 --> 洛杉矶 --> 芝加哥

orderExists = [
        ['Los Angeles','Chicago'],['New York','Los Angeles'],'Chicacgo']
    ]

解决方法

通过将每个内部列表与其排序版本进行比较,您可以创建一个屏蔽列表,其中包含列表中的列表是否已排序。

>>> [x==sorted(x) for x in orderExists]
[True,True,True]

>>> [x==sorted(x) for x in orderViolation]
[True,False]

或者,您可以只比较每个子列表中的每个项目是否大于前一个:

>>> [all(x[i+1]>x[i] for i in range(len(x)-1)) for x in orderViolation]
[True,False]
,

解决方案:

import itertools

def compareOrders(l1,l2):
    
    aa = [elem for elem in l1 if elem in l2]
    bb = [elem for elem in l2 if elem in l1]

    return aa == bb


orderExists = [
        ['Los Angeles','Chicago'],['New York','Los Angeles'],'Chicacgo']
    ]


agreement = []

for a,b in itertools.combinations(orderExists,2):
    if compareOrders(a,b):
        agreement.append(True)
    else: agreement.append(False)

if all(agreement): print('ORDER EXISTS')
else: print('ORDER VIOLATION')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。