Проверьте, находятся ли общие элементы между двумя списками в одном и том же порядке - PullRequest
2 голосов
/ 23 января 2020

Например, есть три списка:

list_1 = ["a","b","c","d"]
list_2 = ["a","x","b","y","c"]
list_3 = ["b","a","c"]
common_elements = ["a","b","c"]

Теперь я должен выяснить, если списки имеют общие элементы, отображаются ли они в одинаковом порядке.

Здесь, например, в list_1 порядок общих элементов a, b, c, а в list_2 также общие элементы отображаются в том же порядке a, b, c, как в list_1

Но в list_3 общие элементы не находятся в том же порядке, что и list_1.

Как можно определить, находятся ли общие элементы в одном и том же порядке.

Ответы [ 3 ]

2 голосов
/ 23 января 2020

Немного неясно, нужно ли вам пересечение всех трех списков вместе или просто любых двух из них. Вот иллюстрация простого подхода для любых двух списков:

>>> list_1 = ["a","b","c","d"]
... list_2 = ["a","x","b","y","c"]
>>> common = set(list_1) & set(list_2)
{'a', 'c', 'b'}
>>> l1 = [v for v in list_1 if v in common]
['a', 'b', 'c']
>>> l2 = [v for v in list_2 if v in common]
['a', 'b', 'c']
>>> l1 == l2
True
0 голосов
/ 23 января 2020

Вы можете попробовать это:

list_1 = ["a","b","c","d"]
list_2 = ["a","x","b","y","c"]
list_3 = ["b","a","c"]

common_elements = ["a","b","c"]

for ix, l in enumerate([list_1, list_2, list_3],1):
    correct_order = True
    if set(common_elements).issubset(set(l)):
        idx = l.index(common_elements[0])
        for i in common_elements[1:]:
            if l.index(i) < idx:
                correct_order = False
                break
        if correct_order: print(f'list {ix} is in correct order')
        else: print(f'list {ix} does not have correct order')
    else:
        print(f'list {ix} does not have all common elements')

Вывод:

list 1 is in correct order
list 2 is in correct order
list 3 does not have correct order
0 голосов
/ 23 января 2020

Вы можете сделать это, просто перебирая один из списков и ища общие элементы во втором, но начиная поиск с того места, где вы нашли предыдущий элемент. Например, что-то вроде этого:

def common_in_order(lst1, lst2):
    # Find common elements
    common = set(lst1)
    common.intersection_update(lst2)
    # Index of the last element found in lst2
    prev_idx = 0
    # Iterate elements of lst1
    for elem in lst1:
        # If it is a common element
        if elem in common:
            try:
                # Look for the element from the previous index onwards
                prev_idx = lst2.index(elem, prev_idx)
            except ValueError:
                # If the element could not be found they are not in the same order
                return False
    # If there were no errors then elements were in the same order
    return True

# Test
list_1 = ["a","b","c","d"]
list_2 = ["a","x","b","y","c"]
list_3 = ["b","a","c"]
print(common_in_order(list_1, list_2))
# True
print(common_in_order(list_1, list_3))
# False
print(common_in_order(list_2, list_3))
# False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...