Как найти элементы в одном произвольном списке, которые встречаются в другом списке (сохраняя их порядок)?
Мне нужно создать алгоритм, который будет читать пользовательский ввод списков 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
Чтобы получить порядок, вам нужно вернуться к итеративному методу, пройдя по первому списку с помощью цикла, в то время как вы будете поддерживать индекс, чтобы знать, где вы находитесь во втором. Для каждого значения в первом списке просмотрите оставшуюся часть второго списка, пока не найдете элемент (временный успех) или не достигните конца (ошибка).
Чтение имен чисел и преобразование их в целые числа - это отдельная проблема и более длинный код.