J'essaie de remplacer la chaîne en double par un entier en double. Par exemple:
mylist = [1, 'state', 'name', 'city', 'name', 1, 'zip']
Je veux que la liste soit
mylist = ["name", "state", "name", "city", "name", "zip", "zip"] from collections import Counter counts = Counter(mylist) for s,num in counts.items(): if num > 1: mylist[mylist.index(s)] = 1
Tous les noms sont renommés 1, ville 2 et zip 3. S'il y a plus de doublons, ceux-ci seront également renommés 4, 5 6 etc.
J'ai essayé avec
mylist = [1, 'State', 1, 2,2,1,3,3,1]
Mais j'ai eu
mylist = ["name", "state", "name", "city", "city", "name", "zip", "zip", "name"]
Comment obtenir 1 pour le nom, 2 pour la ville, 3 pour le zip et 4 pour la prochaine valeur en double?
6 Réponses :
Vous êtes très proche ...
for s in counts: if counts[s] > 1: mylist[mylist.index(s)] = mylist.index(s) # myList is now [0, 'state', 2, 'city', 'name', 5, 6]
Je viens de modifier votre code
mylist = ["name", "state", "name", "city", "city", "name", "zip", "zip", "name"] from collections import Counter counts = Counter(mylist) counts Out[309]: Counter({'city': 1, 'name': 3, 'state': 1, 'zip': 2}) Count=1 for s,num in counts.items(): if num > 1: for i, j in enumerate(mylist): if j==s: mylist[i] = Count Count=Count+1 mylist Out[320]: [1, 'state', 1, 2, 2, 1, 3, 3, 1]
si je veux aussi mettre des nombres pour des valeurs uniques, que dois-je faire? Est-il possible que le code renvoie 1 pour le nom (valeur en double), 2 pour (valeur unique) puis 3 pour la prochaine valeur en double et 4,5,6 pour les prochaines valeurs uniques ou en double. Vous avez déjà répondu à ma question et le code fonctionne bien. Puis-je faire cela dans une fonction au lieu d'écrire une autre fonction pour des valeurs uniques. Merci
num> = 1 a fait le travail souhaité.
Presque là! J'ai commenté le code supplémentaire:
from collections import Counter mylist = ["name", "state", "name", "city", "city", "name", "zip", "zip", "name"] counts = Counter(mylist) c = 0 for s,num in counts.items(): if num > 1: c+= 1 # create a variable (integer) to replace the var in the list (starting with 1 as in your example) for x in mylist: # since index returns only the first instance, iterate over your list if x == s: mylist[mylist.index(x)] = c # replace with your new integer variable print(mylist) # [1, 'state', 1, 2, 2, 1, 3, 3, 1]
Construisez un dictionnaire d'indices pour chaque élément dans ma liste
- ceci est similaire à l'utilisation de collections.Counter sauf que cela préserve les index des éléments. Utilisez un OrderedDict pour conserver l'ordre des éléments dans la liste.
count = 1 for indices in d.values(): if len(indices) > 1: for index in indices: mylist[index] = count count+=1 print(mylist)
Itérer sur les valeurs du dictionnaire; vérifiez la longueur; modifier l'élément si les critères sont remplis.
import collections mylist = ["name", "state", "name", "city", "city", "name", "zip", "zip", "name"] d = collections.OrderedDict() for index, item in enumerate(mylist): try: d[item].append(index) except KeyError: d[item] = [index]
Peut-être pas la plus belle solution, mais cela fonctionne:
mylist = ["name", "state", "name", "city", "city", "name", "zip", "zip"] from collections import Counter counts = Counter(mylist) val = 1 for s,num in counts.items(): if num > 1: counts[s] = val val += 1 else: counts[s] = 0 mylist = [x if counts[x]==0 else counts[x] for x in mylist] mylist
Vous obtenez alors [1, 'state', 1, 2, 2, 1, 3, 3] p >
Utilisez la liste d'origine, sinon il semble que vous ayez un bogue.
Vous pouvez utiliser cette solution:
from collections import Counter from itertools import count from operator import itemgetter mylist = ["name", "state", "name", "city", "city", "name", "zip", "zip", "name"] C = Counter(mylist) c = count(start=1) C = {k: next(c) if v > 1 else k for k, v in C.items()} itemgetter(*mylist)(C) # (1, 'state', 1, 2, 2, 1, 3, 3, 1)
index
renvoie l'index de la seule première occurrence de l'élément dans la liste.