Как я могу проверить, находится ли список в другом списке в том же порядке? - PullRequest
0 голосов
/ 25 февраля 2020

В основном для задания мне нужно определить, является ли список подсписком другого списка, на который я видел ответ в этом посте Проверка, является ли список подсписком , однако существуют некоторые особые требования, которые будет объяснено в примерах, что werent ответил в этом посте. Я также видел этот пост Как проверить, находится ли список в другом списке с таким же порядком python, что также не помогло определить особые требования.

Пример 1:

list1 = 'a,q,b,q,q,q,q,q,q,c'
sublist = 'a,b,c'
output -> True

Объяснение: Теперь я знаю, что это не обязательно подсписок list1, но a, b и c все присутствуют в list1, в том же порядке, что и переменная подсписка, только q разделяет их, который я могу игнорировать, потому что q не находится в подсписке, поэтому это выдает true.

Example2:

list1 = 'b,q,q,q,q,a,q,c'
sublist = 'a,b,c'
output -> False

Объяснение: Хотя этот список содержит a, b и c как и в другом примере, он не в порядке, следовательно, почему он будет ложным

Example3:

list1 = 'a,b,b,q,c'
sublist = 'a,b,c'
output -> False

Example4:

list1 = 'a,b,b,a,b,q,c'
sublist = 'a,b,c'
output -> True

Объяснение: В начале из списка, у нас есть a, b, b, который в приведенном выше объяснении, которое я указал, был ложным, однако после этой части мы имеем правильный порядок a, b, c с aq, разделяющим b и c

Вот мой код. Кажется, что проблема, которую я не могу найти, обнаруживается в одном скрытом тестовом примере, через который мне нужно пройти, я не вижу ввод или вывод, что затрудняет отладку этого. Я пытался запустить множество собственных тестов, но я не могу найти то, что мне здесь не хватает. Мне просто интересно, может ли кто-нибудь выяснить, что я забыл принять во внимание при запуске этого.

sublist = 'a,b,c'.split(',')
l1 = 'a,q,b,a,q,q,q,q,q,q,q,q,q,c'.split(',')
item_order = []

for item in l1:
    #Check if I have found a sublist
    if item_order == sublist:
        break

    #If item is in sublist, but hasnt been seen yet
    elif item in sublist and item not in item_order:
        item_order.append(item)
        print('adding item', item_order)

    #If item has been seen and is in sublist
    elif item in item_order:
        #Reset and add duplicated item 
        item_order = []
        item_order.append(item)
        print('found duplicate, resetting list', item_order)

if item_order == sublist: print("true")
else: print("false")

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Вы можете отфильтровать элементы из list1, которых нет в sublist, и сравнить их с sublist, то есть:

def good_seq(list1, sublist):
    return [x for x in list1.split(",") if x in sublist.split(",")] == sublist.split(",")

Демо

1 голос
/ 25 февраля 2020

Можете ли вы попробовать следующее:

def dedupe(items):
    """Function to remove duplicate by preserving its order

    Args:
        items (list): the list  for which the duplicates must be removed

    Yields:
        generator: the generator with unique items
    """
    seen = set()
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)

def check_order(l1, sublist):
    l1 = list(dedupe(l1))
    result = [val for val in l1 if val in sublist] == sublist
    return result

sublist = 'a,b,c'.split(',')
l1 = 'a,q,b,a,q,q,q,q,q,q,q,q,q,c'.split(',')
print(check_order(l1, sublist))

sublist = 'a,b,c'.split(',')
l1 = 'b,q,q,q,q,a,q,c'.split(',')
print(check_order(l1, sublist))

Вывод:

True
False
...