1
votes

Comment utiliser une compréhension de liste à gauche d'un opérateur d'affectation?

Ma partie de code est:

v=[7,0,2,5,1]               # list with any numbers
x={2,0,4}                   # set of indexes (where element of x < len(v) has been provided)
for i in x:                 # this for loop is working
    v[i]-=10
print(v)                    # good result
[-3, 0, -8, 5, -9]

Ma question est de savoir comment puis-je remplacer le cycle for ci-dessus par une compréhension de liste ou une autre expression plus compacte? Remarque: l'impression montre uniquement les nouvelles valeurs de v mais la tâche serait de ne modifier que certains éléments de la liste v d'origine.


2 commentaires

Pour info, le énumérer est superflu…


@deceze Merci, je l'ai corrigé.


5 Réponses :


2
votes

Je pense que vous avez besoin de:

[-3, 0, -8, 5, -9]

Résultat:

v = [i-10 if idx in x else i for idx,i in enumerate(v)])
print(v)


4 commentaires

Notez que cela coûte plus cher car il parcourt le v plus long au lieu de x , et effectue des tests d'appartenance répétés dans x ; mais c'est le prix que vous payez pour une compréhension de liste ici…


Cela ne change pas les valeurs dans v, je ne sais pas si c'est ce que OP voulait


@Agustin au lieu d'utiliser print si vous attribuez de nouveau à v, il fait ce que OP veut


@AkshayNevrekar Mon impression ne montre que les nouvelles valeurs de v mais la tâche ne modifierait que certains éléments de la liste v d'origine. Donc la question est de savoir s'il y a quelque chose comme ceci: v [expr] = 10 où l'expression a plus de valeurs comme une liste, un tuple. Alors peut-il y avoir une compréhension de liste sur le côté gauche d'un assigment?



0
votes

Vous pouvez essayer la compréhension de liste:

print([v - 10 if i in x else v for i,v in enumerate(v)])


0 commentaires

3
votes

Cela ne répond pas tout à fait à la question, mais à moins que vous n'essayiez de participer à un concours de golf codé, j'espère que vous allez simplement avec ce qui suit. C'est simple et clair - ce n'est pas parce que le code tient sur une seule ligne que ça l'améliore.


1 commentaires

La raison de ma question est seulement la curiosité avec l'utilisation de la compréhension de liste. A côté, je suis d'accord avec vous.



0
votes

Je pense que ci-dessous est ce dont vous avez besoin

[v[i]-10 if i in x else v[i] for i in range(len(v))]
[-3, 0, -8, 5, -9]


0 commentaires

1
votes

Peut-être n'y a-t-il pas trop de raisons de faire une compréhension de liste sur le côté gauche de l'opération de devoir., de plus de modifier l'assignation op. mais néanmoins je voulais construire ceci. La question était donc de savoir comment modifier un élément par un ensemble d'index dans une liste plus longue avec compréhension de liste (sans aucune copie de la liste ni utilisation d'une instruction de cycle explicite). Je ne pourrais réaliser cette solution qu'avec du code "auto-écriture" en utilisant la fonction exec () .

Tout d'abord, je montre une affectation simple avec la même valeur : p>

>>> s1=str(tuple("v["+str(i)+"]-=1" for i in x))
>>> s1
"('v[0]-=1', 'v[2]-=1', 'v[4]-=1')"
# Now I used the REG module for more efficient character replacement.
>>> import re as r
>>> r.sub(r"\(|\)|'","",s1).replace(",",";")
v[0]-=1; v[2]-=1; v[4]-=1'

# Now put them together:
>>> exec(r.sub(r"\(|\)|'","",str(tuple("v["+str(i)+"]-=1" for i in  x))).replace(",",";"))
>>> v
[-1, 0, -1, 0, -1, 0, 0, 0, 0, 0]   # if v was 10*[0]

Maintenant, je montre comment je peux diminuer l'élément de liste de 1 selon x set (comme c'était ma question):

# Let the index set and the "long" list be:
>>> x={0, 2, 4}
>>> v=[0]*10
>>> str(tuple("v["+str(i)+"]" for i in x))+"="+str(len(x)*(1,))
"('v[0]', 'v[2]', 'v[4]')=(1, 1, 1)"
# So I needed to change ("'" to "") at the left side before I could execute it.
>>> str(tuple("v["+str(i)+"]" for i in x)).replace("'","")+"="+str(len(x)*(1,))
'(v[0], v[2], v[4])=(1, 1, 1)'

# Put it into `exec()` function.
>>> exec(str(tuple("v["+str(i)+"]" for i in x)).replace("'","")+"="+str(len(x)*(1,)))
>>> v
[1, 0, 1, 0, 1, 0, 0, 0, 0, 0]

p>


0 commentaires