J'ai la liste suivante1:
from collections import Counter
d = Counter(list1)
res = [k for k, v in d.items() if v > 1]
print([ f'{x} ' for x in res ])
Je voudrais ajouter un espace pour dupliquer les valeurs afin d'obtenir la sortie suivante:
[ f'{x} ' for x in list1 if .... ]
Comme Tom est répété 2 fois le 1er, il a un espace I et le second 2 espaces à la fin
J'avais un truc en utilisant une ligne de code comme celle-ci
['Tom', 'Michael', 'Tom ', 'Tom ']
4 Réponses :
Ceci donne la sortie que vous voulez:
[x[y] + " "*x[:y].count(x[y]) for y in range(len(x))]
Cela donne az de ['Tom', 'Michael', 'Tom', 'Tom']
En tant que compréhension de liste, cela ressemble à:
x = ['Tom', 'Michael', 'Tom', 'Tom']
z=[]
for y in range(len(x)):
z.append(x[y] + " "*x[:y].count(x[y]))
Cela semble être une bonne opportunité d'utiliser un compteur collection, comme ceci:
ans => ['Tom', 'Michael', 'Tom ', 'Tom ']
L'astuce consiste à garder une trace du nombre d'occurrences du nom en utilisant le Counter , et mettez-le à jour au fur et à mesure. Notez que la partie '' * nums [nom] dit simplement: "imprimer ce nombre d'espaces". Cela fonctionne comme prévu:
from collections import Counter
lst = ['Tom', 'Michael', 'Tom', 'Tom']
nums = Counter()
ans = []
for name in lst:
ans.append(name + ' ' * nums[name])
nums[name] += 1
parce que vous souhaitez ajouter des espaces comme nombre d'occurrences jusqu'à chaque élément, vous pouvez utiliser count méthode des listes. Multipliez ensuite ce nombre par "" :
l = ['Tom', 'Michael', 'Tom', 'Tom']
res = []
d = {}
for x in l:
res.append(x + " "*d.setdefault(x, 0))
d[x] += 1
Ou en une seule ligne:
from collections import defaultdict
l = ['Tom', 'Michael', 'Tom', 'Tom']
res = []
d = defaultdict(int)
for x in l:
cnt = d[x]
res.append(x + " "*cnt)
d[x] = cnt + 1
Et les deux donnent comme attendu:
['Tom', 'Michael', 'Tom ', 'Tom ']
Une autre approche différente peut être d'utiliser defaultdict et " Remember " les décomptes en une seule fois ( O (n) code >), au lieu de compter pour chaque élément ( O (n ^ 2) ):
res = [l[i] + " " * l[:i].count(l[i]) for i in range(len(l))]
De cette façon si un élément est vu pour le premier heure à laquelle son décompte sera initialisé à 0.
Ou, enfin, sans aucune importation. Nous pouvons simplement utiliser un dictionnaire normal et profiter de setdefault méthode:
l = ['Tom', 'Michael', 'Tom', 'Tom']
res = []
for i in range(len(l)):
cnt = l[:i].count(l[i])
res.append(l[i] + " "*cnt)
Voici une solution qui évite d'utiliser à plusieurs reprises le nombre sur la liste d'origine.
Nous construisons la liste de sortie, en gardant une trace avec un collections.Counter des éléments précédemment rencontrés:
from collections import Counter
data = ['Tom', 'Michael', 'Tom', 'Tom']
out = []
counts = Counter()
for item in data:
out.append(item + ' '*counts[item])
counts.update((item,))
print(out)
# ['Tom', 'Michael', 'Tom ', 'Tom ']
Notez la virgule dans count.update ((item,)) : comme la mise à jour attend un itérable, nous lui passons un tuple contenant un seul élément, notre item . Passer directement la chaîne compterait les lettres individuelles.
Qu'avez-vous essayé jusqu'à présent (qu'il s'agisse de boucles simples ou de compréhension de listes)?