【问题标题】:list comparasion based on a weak order of a sequence基于序列弱顺序的列表比较
【发布时间】:2021-07-28 21:59:44
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

标签: python list compare


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回复。这个解决方案非常适合我提供的测试用例,但是如果我有一个城市列表并且每个子列表都是访问它们的顺序版本。例如:纽约 --> 洛杉矶 --> 芝加哥 orderExists = [ ['Los Angeles', 'Chicago'], ['New York','Los Angeles'], ['New York','Chicacgo'] ]
  • @alcheringa 请编辑您的问题并包含代表您实际问题的测试用例。
【解决方案2】:

解决方案:

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'],
        ['New York','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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    相关资源
    最近更新 更多