Il semble que vous confondiez compréhension de la liste con Constructions en boucle en Python.
La compréhension d'une liste produit -- une liste ! Elle ne se prête pas à une affectation unique dans une liste existante. (Bien qu'il soit possible de torturer la syntaxe pour le faire...)
Bien que ce que vous essayez de faire à partir de votre code ne soit pas exactement clair, je pense que cela ressemble plus à une boucle sur la liste (contrôle de flux) qu'à la production d'une liste (compréhension de liste).
Passez en boucle sur la liste comme suit :
for pattern in patterns:
if lst[0] == pattern: lst[0]=''
C'est une façon raisonnable de procéder, et c'est ce que vous feriez en C, en Pascal, etc. Mais vous pouvez également tester la liste pour une seule valeur et la modifier :
if lst[0] in patterns: lst[0] = ''
Ou, si vous ne connaissez pas l'index :
i=lst.index[pattern]
lst[i]=''
ou, si vous avez une liste de listes et que vous souhaitez modifier chaque premier élément de chaque sous-liste :
for i, sublst in enumerate(lst):
if sublst[i][0] in patterns: sublist[i][0]=''
etc, etc, etc.
Si vous souhaitez appliquer quelque chose à chaque élément d'une liste, vous pouvez utiliser une compréhension de liste, ou une carte, ou l'un des nombreux autres outils du kit Python.
Personnellement, j'ai tendance à utiliser les compréhensions de listes plutôt pour la création de listes :
l=[[ x for x in range(5) ] for y in range(4)] #init a list of lists...
Ce qui est plus naturel que :
l=[]
for i in range(4):
l.append([])
for j in range(5):
l[i].append(j)
Mais pour modifier cette même liste de listes, qu'est-ce qui est le plus compréhensible ?
Ceci :
l=[['new value' if j==0 else l[i][j] for j in range(len(l[i]))] for i in range(len(l))]
ou ceci :
for i,outter in enumerate(l):
l[i][0]='new value'
YMMV
Ici est un excellent tutoriel à ce sujet.