1
votes

Comment renommer les doublons de chaîne en python?

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?


1 commentaires

index renvoie l'index de la seule première occurrence de l'élément dans la liste.


6 Réponses :


0
votes

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]


0 commentaires

1
votes

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]


2 commentaires

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é.



1
votes

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]


0 commentaires

1
votes

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]


0 commentaires

1
votes

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 >


1 commentaires

Utilisez la liste d'origine, sinon il semble que vous ayez un bogue.



0
votes

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)


0 commentaires