Как найти элементы в одном произвольном списке, которые встречаются в другом списке (сохраняя их порядок)?

Мне нужно создать алгоритм, который будет читать пользовательский ввод списков A а также B и определить, есть ли элементы из списка B встречаться в списке A (если они происходят, программа должна напечатать "Да" и "Нет" в противном случае).

Я придумал следующий код, который должен быть отправной точкой:

n=int(input('Enter the length of list A '))
A=[]
for i in range (0,n):
    InpEl=int(input('Enter the elements '))
    A.append(InpEl)
print(A)
n=int(input('Enter the length of list B '))
B=[]
for i in range (0,n):
    InpEl2=int(input('Enter the elements '))
    B.append(InpEl2)
print(B)

checklist=B
for each in A:
    if each in checklist:
        print('YES')
    else:
         print('NO')

Хотя в любом случае я получаю "Нет". В чем здесь ошибка?

Кроме того, позже мне может понадобиться изменить список, чтобы программа могла определить, B происходят в A в порядке их появления в B, но не обязательно последовательно.

For example, let M be the length of B and N be the length of A.
Then the program should return yes if there are indices i0, i1...im+1 such that 0<= i0 < i1...< im-1 < N such that A[i0] = B[0];A[i1] = B[1]...A[im-1] =
B[m-1].

Есть ли более простой способ построить цикл, который бы удовлетворял такой запрос?

PS: можно ли заставить пользовательский ввод читать не только целые числа, но и строки? Я не уверен, если raw_input было бы полезно в Python 3.5.

PSS: извините, я допустил небольшую ошибку при вводе кода здесь, я исправил его сейчас. Другой вопрос: я получаю вывод нескольких yes 'и no для каждого элемента:

Enter the length of list A 3
Enter the elements 1
Enter the elements 2
Enter the elements 3
[1, 2, 3]
Enter the length of list B 3
Enter the elements 5
Enter the elements 4
Enter the elements 3
[5, 4, 3]
NO
NO
YES

Как я могу изменить код так, чтобы он печатал только одно "да" и "нет" только один раз в случае каких-либо происшествий?

2 ответа

Вот одно из решений. Имейте в виду, что многие задавали этот тип вопросов раньше, и перед тем, как задавать вопросы, лучше всего искать.

a = input('enter list A with comma between each element: ')
b = input('enter list B with comma between each element: ')

a = a.split(',')
b = b.split(',')

contained_in_b = [element in b for element in a]

for i, in_b in enumerate(contained_in_b):
    print('element {} contained in list B: {}'.format(a[i], in_b))

Лучше собрать все исходные данные и использовать Python, чтобы разбить их на списки. Таким образом, пользователю не нужно заранее указывать длину списка. Кроме того, нет необходимости конвертировать в int - сравнения строк работают нормально.

contained_in_b использует понимание списка - удобная функция Python, которая применяет логическое значение element in b для каждого element в a, Теперь у вас есть список значений True/False, которые вы можете enumerate через, чтобы распечатать желаемый результат.

Одно оружие, которое вы получаете, это оператор all, который просто проверяет, что все элементы в итерируемом являются True:

A = [1, 4, 6, 8, 13]
B = [4, 6, 13, 8]
C = [3, 8, 25]

master = [i for i in range(20)]

print all(i in master for i in A)
print all(i in master for i in B)
print all(i in master for i in C)

Выход:

True
True
False

Чтобы получить порядок, вам нужно вернуться к итеративному методу, пройдя по первому списку с помощью цикла, в то время как вы будете поддерживать индекс, чтобы знать, где вы находитесь во втором. Для каждого значения в первом списке просмотрите оставшуюся часть второго списка, пока не найдете элемент (временный успех) или не достигните конца (ошибка).

Чтение имен чисел и преобразование их в целые числа - это отдельная проблема и более длинный код.

Другие вопросы по тегам