Возвращаемая строка соответствует двум спискам для заданного количества элементов в третьем списке

У меня появилось ощущение, что мне придётся пойти в "руководство для начинающих" или что у вас есть, но у меня есть этот код здесь, который идет

does = ['my','mother','told','me','to','choose','the']
it = ['my','mother','told','me','to','choose','the']
work = []

while 5 > len(work):
    for nope in it:
        if nope in does:
            work.append(nope)

print (work)

И я получаю

['my', 'mother', 'told', 'me', 'to', 'choose', 'the']

Почему это? И как я могу убедить его вернуться

['my', 'mother', 'told', 'me']

Ответ 1

Вы можете попробовать что-то вроде этого:

for nope in it:
   if len(work) < 5 and nope in does:
       work.append(nope)
   else:
       break

Проблема с вашим кодом заключается в том, что он проверяет длину работы после прокрутки всех элементов it и добавил все из них, которые находятся в does.

Ответ 2

Вы можете сделать:

does = ['my','mother','told','me','to','choose','the']
it = ['my','mother','told','me','to','choose','the']
work = []
for nope in it:
    if nope in does:
        work.append(nope)
work = work[:4]
print (work)

Он просто делает список без проверки длины, затем разрезает его и оставляет только 4 первых элемента.

Ответ 3

В качестве альтернативы, чтобы немного приблизиться к исходной логике:

i = 0
while 4 > len(work) and i < len(it):
    nope = it[i]
    if nope in does:
        work.append(nope)
    i += 1

# ['my', 'mother', 'told', 'me', 'to']

Ответ 4

Просто для удовольствия, здесь однострочный без импорта:

does = ['my', 'mother', 'told', 'me', 'to', 'choose', 'the']
it = ['my', 'mother', 'told', 'me', 'to', 'choose', 'the']
work = [match for match, _ in zip((nope for nope in does if nope in it), range(4))]