# Removing some element of a list according to the zero of another

I have the following code.

candidats = 4  # nombre de candidats
Pref = Arrangements(["a", "b", "c", "d"], candidats).list()
show(Pref)
show(LatexExpr("Nombre~de~préférences~possibles~="+latex(len(Pref))))
elec = 100
candidats = 4
nn = list([i for i in range(len(Pref))])
ZZ = IntegerRing()
PP = ([0 for i in nn])
PP = ZZ.random_element(0, elec)
for k in nn:
PP[k] = ZZ.random_element(0, elec - sum(PP[j] for j in nn[:k]))
PP[len(Pref) - 1] = (PP[len(Pref) - 1] if (elec - sum(PP)) == 0
else  PP[len(Pref) - 1] + (elec - sum(PP)))
import random
PP1 = random.sample(PP, len(PP))
show(sum(PP))
show(PP)
show(PP1)
show(Pref)
def rz(l1, l2):
for k in range(len(l1)):
if l1[k] == 0:
del(l2[k])
show([len(PP), len(Pref)])
show(rz(PP, Pref))


The problem here begins with def rz... I would like to delete the elements of the lists Pref and PP at indices where the list PP has zeros. But it doesn't work. I do not find my error. I was also wondering if it could be done by embedding "two list comprehensions".

edit retag close merge delete

Sort by » oldest newest most voted Like this

def remove_zero(l1, l2):
return [z1 for z1, z2 in zip(l1, l2) if z2]

more

Sorry but I do not understand you suggestion. I understand the meaning of zip but not the idea --- where is the condition. + SM said that zip is not scriptable.

C'est littéralement la liste des z1 dans l1 tels que l'élément z2 correspondant dans l2 soit non nul. La condition est à la fin ; j'aurais pu écrire "if z2 != 0" mais j'ai utilisé une forme équivalente abrégée.

Merci FrédéricC. Mais sans z2 != 0 tous les zéros ne sont pas éliminés.