J'ai une liste lst = [1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4 , 4,4]
J'attends la sortie suivante:
`def splrep(lst):
from collections import Counter
C = Counter(lst)
flst = [ [k,]*v for k,v in C.items()]
nl = []
for i in flst:
nl1 = []
for j,k in enumerate(i):
nl1.append(j)
nl.append(nl1)
ng = list(zip(flst, nl))
for i,j in ng:
j.pop(0)
for i,j in ng:
for k in j:
i[k] = ''
final = [i for [i,j] in ng]
fin = [i for j in final for i in j]
return fin`
Je souhaite conserver la première occurrence de l'élément et remplacer toutes les autres occurrences du même élément avec des chaînes vides.
J'ai essayé l'approche suivante.
out = [1,"","",2,"","","",3,"","","","",4,"","","","","","","",""]
Mais je recherche des approches plus simples ou meilleures.
7 Réponses :
Essayez cette fonction plus simple:
>>> lst = [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4] >>> out = fill_blank(lst) >>> print(out) [1, '', '', 2, '', '', '', 3, '', '', '', '', 4, '', '', '', '', '', '', '', '']
Utilisez-la comme telle:
def fill_blank(l):
filled = []
last = l[0]
for i in l:
if i != last:
last = i
filled.append(last)
return filled
En utilisant une itération simple
Ex:
[1, '', '', 2, '', '', '', 3, '', '', '', '', 4, '', '', '', '', '', '', '', '']
Sortie:
lst = [1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4]
dup_check = set()
result = []
for i in lst:
if i not in dup_check:
result.append(i)
dup_check.add(i)
else:
result.append("")
print(result)
Faites-le si vous ne souhaitez pas utiliser set ou itertools :
[1, '', '', 2, '', '', '', 3, '', '', '', '', 4, '', '', '', '', '', '', '', '']
Résultat :
lst = [1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4]
new_lst = []
for i in lst:
if i in new_lst:
new_lst.append("")
else:
new_lst.append(i)
print(new_lst)
La solution courte (one-liner) sans utilisation de modules est la suivante:
[1, '', '', 2, '', '', '', 3, '', '', '', '', 4, '', '', '', '', '', '', '', '']
sortie
lst = [1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4] out = ["" if (i in lst[:inx]) else i for inx,i in enumerate(lst)] print(out)
Vous pouvez essayer l'approche ci-dessous.
lst = [1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4]
fin=[]
for each in lst:
if each not in fin:
fin.append(each)
else:
fin.append("")
print(fin)
Vous pouvez stocker les premières occurrences dans un dictionnaire avec dict.setdefault () , puis conservez les premiers nombres trouvés selon qu'ils existent dans ce dictionnaire:
lst = [1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4]
first_indices = {}
for i, x in enumerate(lst):
first_indices.setdefault(x, i)
result = [x if first_indices[x] == i else "" for i, x in enumerate(lst)]
print(result)
# [1, '', '', 2, '', '', '', 3, '', '', '', '', 4, '', '', '', '', '', '', '', '']