Проверьте, содержится ли список A в списке B - PullRequest
0 голосов
/ 19 января 2019

У меня есть два списка, A & B, и я хотел бы проверить, содержится ли A в B.Под «содержащимися» я подразумеваю, что элементы A появляются в том же порядке в пределах B без каких-либо других элементов между ними.То, что я ищу, очень похоже на поведение A in B, если они были строками.

Некоторые элементы A будут повторяться.Мы можем предположить, что A будет короче B.

Существует множество ответов на аналогичные вопросы по SO, но большинство отвечает на другой вопрос:

  • Is Aэлемент B?(Не мой вопрос: B - это плоский список, а не список списков.)
  • Содержатся ли все элементы A в B?(Не мой вопрос: я также обеспокоен порядком.)
  • Является ли A подсписком B?(Не мой вопрос: я не хочу знать, появляются ли элементы A в том же порядке в B, я хочу знать, появляются ли они точно , как они где-то в B.)

Если бы операция была реализована как ключевое слово containedin, она бы работала так.

>>> [2, 3, 4] containedin [1, 2, 3, 4, 5]
True
>>> [2, 3, 4] containedin [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
False
>>> [2, 3, 4] containedin [5, 4, 3, 2, 1]
False
>>> [2, 2, 2] containedin [1, 2, 3, 4, 5]
False
>>> [2, 2, 2] containedin [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
False
>>> [2, 2, 2] containedin [1, 1, 1, 2, 2, 2, 3, 3, 3]
True

Существует ли краткий способ выполнить эту операцию в Python?Я скучаю по какой-то важной терминологии, которая привела бы меня к ответу быстрее?

Ответы [ 8 ]

0 голосов
/ 19 января 2019

Не нужно нарезать для каждого элемента:

def contains(seq, sub):
    sub_length = len(sub)
    sub_first = sub[0]
    return any(sub == seq[index:index+sub_length]
               for index, element in enumerate(seq)
               if element == sub_first)

Использование:

>>> seq = [1, 2, 3, 4, 5]
>>> sub = [2, 3, 4]

>>> contains(seq, sub)
True
0 голосов
/ 19 января 2019

Как то так?

class myList(list):
    def in_other(self, other_list):
        for i in range(0, len(other_list)-len(self)):
            if other_list[i:i+len(self)] == self:
                return True
            else:
                continue

if __name__ == "__main__":

    x = myList([1, 2, 3])
    b = [0, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]

    print(x.in_other(b))
0 голосов
/ 19 января 2019

многие люди опубликовали свои ответы. но я все равно хочу опубликовать свои усилия;) это мой код:

def containedin(a,b):
    for j in range(len(b)-len(a)+1):
        if a==b[j:j+len(a)]:
            return True
    return False

print(containedin([2, 3, 4],[1, 2, 3, 4, 5]))
print(containedin([2, 3, 4],[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]))
print(containedin([2, 3, 4],[5, 4, 3, 2, 1]))
print(containedin([2, 2, 2],[1, 2, 3, 4, 5]))
print(containedin([2, 2, 2],[1, 1, 1, 2, 2, 2, 3, 3, 3]))

это вывод: Правда Ложь Ложь Ложь Правда

0 голосов
/ 19 января 2019

Вы можете объединить 2 списка в две разные строки. Затем напишите функцию, чтобы проверить, находится ли одна строка в другой.

def containedin(a, b):
 if b in a:
  return True
 return False`
0 голосов
/ 19 января 2019

Учитывая необходимость сохранения заказа:

def contains(sub_array, array):
    for i in range(len(array)-len(sub_array)+1):
        for j in range(len(sub_array)):
            if array[i+j] != sub_array[j]:
                break
        else:
            return i, i+len(sub_array)
    return False
0 голосов
/ 19 января 2019

Используйте эту функцию

Я пытался не усложнять

def contains(list1,list2):

    str1=""
    for i in list1:
        str1+=str(i)

    str2=""
    for j in list2:
        str2+=str(j)

    if str1 in str2:
        return True

    else:
        return False

Надеюсь, что это работает:)

0 голосов
/ 19 января 2019

Используйте any с нарезкой списка:

def contained_in(lst, sub):
    n = len(sub)
    return any(sub == lst[i:i+n] for i in range(len(lst)-n+1))

Или используйте join для объединения обоих списков в строки и используйте оператор in:

def contained_in(lst, sub):
    return ','.join(map(str, sub)) in ','.join(map(str, lst))

Использование :

>>> contained_in([1, 2, 3, 4, 5], [2, 3, 4])
True
>>> contained_in([1, 2, 2, 4, 5], [2, 3, 4])
False
0 голосов
/ 19 января 2019

Предполагая, что a всегда меньше b, вы можете сделать следующее:

 any(a == b[i:i+len(a)] for i in range(len(b)-len(a)+1))
...