Вам нужно разбить код на более простую форму, чтобы понять его.
Взять первый пример.
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
def common_in_two_lists1(list1, list2):
re_list = []
for val1 in list1:
for val2 in list2:
if val1 == val2 and val1 not in re_list:
re_list.append(val1)
print(re_list)
return re_list
l = common_in_two_lists1(a, b)
OUTPUT
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 5]
[1, 2, 3, 5, 8]
[1, 2, 3, 5, 8, 13]
Вы можете видеть, что re_list
добавляет значение каждый раз. И []
, который вы положили для первого примера, бесполезен.
Подойдем ко второму примеру. Если вы проверите тип выражения, вы обнаружите, что оно является генератором.
re_list = print(type(val1 for val1 in list1 for val2 in list2 if val1 == val2 and val1 not in re_list))
<class 'generator'>
И выражение генератора вычисляется только тогда, когда вы пытаетесь получить значение, что объясняет, почему вы получаете дубликат 1 в этом коде. Потому что в выражении re_list
пусто при создании генератора.
Наконец-то пришло ваше решение:
Я пытаюсь написать программу, которая возвращает список, который содержит только элементы, общие для списков (без дубликатов).
Вы должны следовать совету Джона Клементса и выполнять его, используя набор
Вы должны взглянуть на наборы ... например: список (набор (а). Пересечение (б))