Вложенные условные обозначения в понимании вложенного списка

#python #list-comprehension

Вопрос:

Я пытаюсь поместить вложенное условие во вложенный оператор понимания списка на python, но я не уверен, чего мне не хватает, чтобы это стало возможным, обычный цикл и условие выглядели бы так

 newarr = []
    for i in array1:
        for x in array2:
            if x.find(i) !=-1:
                if i not in newarr:
                    newarr.append(i)
 

и к чему я пришел благодаря пониманию списка, так это к следующему

 newarr = [[i for x in array2 if x.find(i) != -1] for i in array1]
 

Ответ №1:

Вы можете поместить несколько for предложений в понимание списка, и они будут оцениваться в порядке слева направо, как если бы они были вложены, до того, как будет оценено фактическое значение или проверены условия.

 newarr = list(set(i for i in array1 for x in array2 if x.find(i) != -1))
 

Использование set() в качестве альтернативы if i not in newarr проверке, которую невозможно представить в понимании списка, поскольку список newarr еще не полностью сформирован. Вместо этого в выводе будут отсутствовать дубликаты (последнее вхождение будет иметь приоритет для целей упорядочения).

Если вы хотите сохранить первое вхождение, а не последнее, попробуйте сделать list(reversed(set(i for i in reversed(array1) ...))) это вместо этого.