Я пытаюсь использовать List Consrehension для выполнения следующего. Я хочу создать новый список (уникальный), который имеет только общие номера из обоих списков.
unique = []
for listcomp in range(len(list1)):
if list1[listcomp] in list2 and list1[listcomp] not in unique:
unique.append(list1[listcomp])
else:
continue
Выше работает отлично, но когда я создаю понимание List ниже, я получаю дубликаты, если list1 имеет повторяющиеся числа. т.е. list1 = [1, 1, 2], list2 = [1, 5]. Я создал свое понимание списка как
unique = [list1[listcomp] for listcomp in range(len(list1)) if list1[listcomp] in list2 and list1[listcomp] not in unique]
Если я получаю дубликаты, я предполагаю, что выражение "и" не применяется? Я прочитал другие запросы о перемещении оператора if в соответствии с инструкцией по пониманию, но это не сработало. Можете ли вы использовать AND для расширения условий?
Большое спасибо
Мой полный код: -
import random as rnd
# Randomly generate the size of your list
list1size = rnd.randint(1,20)
list2size = rnd.randint(1,20)
# Declare your list variables
list1 = []
list2 = []
# Fill your lists with randomly generated numbers upto the listsize generated above
for x in range(list1size):
list1.append(rnd.randint(1,15))
for y in range(list2size):
list2.append(rnd.randint(1,15))
# Not required but easier to read lists once sorted
list1.sort()
list2.sort()
print(list1)
print(list2)
# Now to compare old school
unique = []
# for listcomp in range(len(list1)):
# if list1[listcomp] in list2 and list1[listcomp] not in unique:
# unique.append(list1[listcomp])
# else:
# continue
# Now to compare with list comprehension
unique = [list1[listcomp] for listcomp in range(len(list1)) if list1[listcomp] in list2 and list1[listcomp] not in unique]
# Above doesn't stop duplicates if they are in List1 so I assume you can't use AND
print(f"The common numbers in both lists are {unique}")
Вы не можете получить доступ к элементам, созданным по усмотрению списка, по ходу дела. Ваше условие list1[listcomp] not in unique
будет list1[listcomp] not in unique
, всегда будет возвращать значение True
поскольку в тот момент времени unique
определяется как пустой список, инициализированный в unique = []
.
Таким образом, and
оператор применяется, но не в пути вы хотите.
Вместо этого вы можете создать "замеченный" set
предметов, которые вы уже нашли, и опустить их. Стандартная реализация найдена в itertools
unique_everseen
.
Если у вас есть сторонняя библиотека toolz
, вы можете использовать идентичный toolz.unique
и toolz.unique
выражение генератора. Более Pythonic, вы можете перебирать элементы напрямую, а не использовать индексы:
from toolz import unique
unique = list(unique(i for i in list1 if i in list2))
set
неупорядочен, любой получаемый вами порядок, который вы ожидаете, должен рассматриваться как совпадение.