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, '', '', '', '', '', '', '', '']