2 votes

Comment convertir les éléments d'une liste de listes en fonction du dictionnaire de cartes d'étiquettes ?

J'essaie de convertir les éléments d'une liste de liste en fonction du dictionnaire de cartes d'étiquettes. Cette liste originale de listes se présente comme suit

original= [['0','1','2'],
           ['0', '0', '0', '0', '0', '0', '0', '1', '2', '0'],
           ['0', '0', '1', '2', '0', '0', '0', '0']]

Le dictionnaire d'étiquettes que je souhaite convertir en éléments de la base de données des original selon :

twitter_label_map = {'0':'O', '1':'B_A', '2':'I_A'}

Le résultat souhaité devrait être le suivant :

desired = [['O','B_A','I_A'],
           ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'],
           ['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]

J'ai essayé de le faire :

desired = [[twitter_label_map[old_label] for labels_list in original] for old_label in labels_list]

Cependant, j'obtiens l'erreur suivante :

NameError: name 'labels_list' is not defined

Merci d'avance !

1voto

Prune Points 4656

L'emboîtement de votre compréhension est inversé. Vous devez définir labels_list dans les parenthèses extérieures avant de pouvoir l'utiliser dans les parenthèses intérieures. Pensez en termes de boucles imbriquées.

1voto

costaparas Points 4673

Vous êtes sur la bonne voie, mais vous avez mélangé les variables dans la compréhension de votre liste.

Vous avez ici des listes imbriquées. Par conséquent, vous devez parcourir en boucle chaque sublist en original puis d'appliquer le twitter_label_map à chaque élément e en sublist :

original = [
    ['0', '1', '2'],
    ['0', '0', '0', '0', '0', '0', '0', '1', '2', '0'],
    ['0', '0', '1', '2', '0', '0', '0', '0']
]

twitter_label_map = {'0': 'O', '1': 'B_A', '2': 'I_A'}

result = [[twitter_label_map[e] for e in sublist] for sublist in original]

print(result)

Sortie :

[['O', 'B_A', 'I_A'], ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'], ['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]

Ce qui précède est équivalent à :

result = []
for sublist in original:
    sub = []  # transformed sublist
    for e in sublist:
        sub.append(twitter_label_map[e])
    result.append(sub)

En d'autres termes, des boucles imbriquées, dans lesquelles nous ajoutons à chaque boucle transformée des éléments d'information sur les activités de l'entreprise. sublist à un result liste.

1voto

PawlsToTheWall Points 21
desired = [[twitter_label_map[ele] for ele in lst] for lst in original]

Le résultat est le suivant :

[['O', 'B_A', 'I_A'],
['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'], 
['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]

La compréhension de la liste est la même que la suivante avec des boucles for :

desired = []
for lst in original:
    new_lst = []
    for ele in lst:
        new_lst.append(twitter_label_map[ele])
    desired.append(new_lst)

1voto

Talendar Points 1008

Toutes les autres réponses utilisent explicitement des boucles. Si vous n'avez pas envie d'utiliser des boucles, voici une autre façon d'obtenir ce que vous voulez :

def parse_symbols(symbols_list):
    return list(map(lambda e: twitter_label_map[e], symbols_list))

results = list(map(parse_symbols, original))
print(results)

Sortie :

[['O', 'B_A', 'I_A'], ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'], ['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]

En fonction de votre cas d'utilisation, l'utilisation de map pourrait donner de meilleurs résultats ( source ) :

Étant donné que map() est écrit en C et qu'il est hautement optimisé, ses fonctions internes sont très limitées. interne peut être plus efficace qu'une boucle for normale de Python. C'est l'un des avantages de l'utilisation de map().

Cette méthode vous permettra également d'implémenter plus facilement le traitement parallèle dans votre code, si vous en avez besoin à l'avenir (voir multiprocessing.Pool.map ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X