3 votes

Générer une liste de mots uniques à partir d'une liste de mots d'une liste

Voir les données suivantes. Je veux obtenir une liste de mots uniques à partir de celles-ci. J'ai préparé le code de base suivant pour vous. Quelqu'un pourrait-il améliorer le code pour une meilleure et une plus rapide performance en Python 3.X?

data = [
    [
        ['hello'],
        ['hi', 'top'],
        ['how', 'are', 'you']
    ],
    [
        ['hey', 'jane'],
        ['good', 'morning'],
        ['how', 'are', 'you']
    ]
]
vocab = []
for d in data:
    for s in d:
        for w in s:
            if w not in vocab:
                vocab.append(w)
vocab = sorted(vocab)
print(vocab) # ['are', 'good', 'hello', 'hey', 'hi', 'how', 'jane', 'morning', 'top', 'you']

4voto

CommuSoft Points 6439

Si les éléments sont hashable (les chaînes de caractères le sont), il n'est généralement pas conseillé de vérifier l'unicité vous-même. Python a déjà conçu une structure pour cela : un set. Un set garantit que chaque élément égal se produit au plus une fois (donc il se produit une fois, ou pas du tout).

Nous pouvons fournir un set(..) un objet itérable, comme par exemple un générateur qui générera les mots, et après la construction du set, nous pouvons (optionnellement) trier les éléments dans le set, ainsi :

sorted(set(w for d in data for s in d for w in s))

Ici, nous construisons d'abord un set des éléments produits par le générateur (w for d in data for s in d for w in s) (qui est essentiellement une représentation compacte de vos boucles for en cascade). Un set utilise le hashage et, en conséquence, il peut vérifier l'appartenance assez rapidement. Ensuite, nous itérons sur le set(..) et trions les éléments produits.

Les versions modernes de Python supportent également la compréhension de set : nous pouvons fusionner set() en {}, c'est plus agréable syntaxiquement, mais cela entraînera généralement également une accélération, ainsi :

sorted({w for d in data for s in d for w in s})

3voto

pylang Points 12013

more_itertools.collapse aplatit les listes imbriquées de manière profonde, à partir desquelles vous pouvez obtenir des mots uniques via set().

import more_itertools as mit

set(mit.collapse(data))
# {'are', 'good', 'hello', 'hey', 'hi', 'how', 'jane', 'morning', 'top', 'you'}

more_itertools est un package tiers. Installez-le via > pip install more_itertools.

1voto

Ajax1234 Points 42210

Vous pouvez utiliser la compréhension d'ensemble dans la récursion :

data = [
[
    ['hello'],
    ['hi', 'top'],
    ['how', 'are', 'you']
],
[
    ['hey', 'jane'],
    ['good', 'morning'],
    ['how', 'are', 'you']
  ]
]
def get_unique(s):
  return {i for c in [b if all(isinstance(d, str) for d in b) else get_unique(b) for b in s] for i in c}
print(list(get_unique(data)))

Sortie :

['good', 'top', 'hey', 'morning', 'how', 'hi', 'are', 'jane', 'you', 'hello']

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