如何解决基于序列弱序的列表比较
orderExists = [
['a','c','d','e'],['b','f'],['a','b','e']
]
orderViolation = [
['a','e','b']
]
存在顺序是因为有效序列应类似于 a,b,c,d,e,f
。
在子列表中元素可能不存在。
例如,在 orderExists[0] = ['a','e']
中,b
和 f
不存在,但只要 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 举报,一经查实,本站将立刻删除。