Можете ли вы использовать AND в условных выражениях списка понимания?

1

Я пытаюсь использовать 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}")
Теги:
list
python-3.x
list-comprehension

1 ответ

2

Вы не можете получить доступ к элементам, созданным по усмотрению списка, по ходу дела. Ваше условие 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))
  • 0
    Большое спасибо, я думаю, что это недостаток одной строки кода :-) Мне удалось заставить его работать с набором "unique = [a для in in set (list1), если a in list2]"
  • 0
    @Chunkylump, просто второстепенный вопрос, единственная проблема с вашим кодом - это то, что порядок не гарантирован, set неупорядочен, любой получаемый вами порядок, который вы ожидаете, должен рассматриваться как совпадение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню