Je souhaite remplacer la valeur de chaîne dans la liste Python par une valeur numérique spécifique. Par exemple si j'ai une liste:

l = ["orange", "lemon", "apple", "orange", "apple","orange", "lemon","lemon", "apple", "grape", "grape", "lemon", "grape"]

Je veux obtenir:

l = [1, 2, 3, 1, 3, 2, 2, 3, 4, 4, 2, 4]

Je sais que cela peut être fait avec la fonction pandas et map. Mais que faire si j'ai 50 catégories différentes? Ce serait stupide d'écrire un cas différent pour chaque catégorie? Existe-t-il un moyen de le faire automatiquement?

0
taga 5 nov. 2020 à 02:50

2 réponses

Meilleure réponse

Probablement pas pratique, mais vous pouvez utiliser l'identifiant de chaque chaîne:

l = ["orange", "lemon", "apple", "orange", "apple"]
l2 = [id(s) for s in l]
print(l2)

Production:

[2379879963760, 2379879963504, 2379877859760, 2379879963760, 2379877859760]

Chaque chaîne unique aura un identifiant unique.

1
Ann Zen 5 nov. 2020 à 00:04

Cela peut simplement être accompli avec une compréhension de liste sans utiliser de Pandas:

>>> [l.index(i) + 1 for i in l]
[1, 2, 3, 1, 3, 1, 2, 2, 3, 10, 10, 2, 10]

Notez que chaque valeur du résultat est unique pour une chaîne donnée.

Mise à jour: si vous voulez avoir le résultat exact de votre question, c'est un peu plus compliqué. Puisque Python n'a pas de OrderedSet intégré, vous pouvez utiliser OrderedDict pour l'imiter et extraire les valeurs uniques dans l'ordre:

>>> from collections import OrderedDict
>>> unique_elements = OrderedDict(zip(l, range(len(l))))
>>> d = dict(zip(unique_elements, range(1, 1 + len(unique_elements))))
>>> [d[i] for i in l]
[1, 2, 3, 1, 3, 1, 2, 2, 3, 4, 4, 2, 4]
0
Selcuk 5 nov. 2020 à 00:24