Можете ли вы использовать AND в условных выражениях списка понимания? - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь использовать список понимания, чтобы выполнить следующее. Я хочу создать новый список (уникальный), который имеет только общие номера из обоих списков.

unique = []
for listcomp in range(len(list1)):
    if list1[listcomp] in list2 and list1[listcomp] not in unique:
        unique.append(list1[listcomp])
    else:
        continue

Выше работает нормально, но когда я создаю понимание списка ниже, я получаю дубликаты, если в 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}")

1 Ответ

0 голосов
/ 03 июля 2018

Вы не можете получить доступ к элементам, создаваемым списком, по мере продвижения. Ваше условие list1[listcomp] not in unique всегда будет возвращать True, поскольку в этот момент времени unique определяется как пустой список, инициализированный в unique = [].

Таким образом, оператор and применяется, но не так, как вы хотите.

Вместо этого вы можете создать «видимый» set содержащий предметы, которые вы уже нашли, и опустить их. Стандартная реализация находится в рецепте itertools unique_everseen .

Если у вас есть сторонняя библиотека toolz, вы можете использовать идентичную toolz.unique и передать выражение генератора. Более Pythonic, вы можете перебирать элементы напрямую, а не использовать индексы:

from toolz import unique

unique = list(unique(i for i in list1 if i in list2))
...