Moyen efficace pour créer une liste, ou d'y ajouter s'il en existe déjà?
Je suis passer par tout un tas de tuples avec une plusieurs-à-plusieurs corrélation, et je veux faire un dictionnaire où chaque b (a,b) a une liste de tous les "a", qui correspondent à un b. Il semble maladroit de test pour une liste à clé b dans le dictionnaire, puis chercher un à un, puis ajouter un si ce n'est pas déjà là, à chaque fois par le tuple à digérer boucle; mais je n'ai pas trouvé une meilleure façon encore. N'existe? Est-il une autre façon de faire ce qui est beaucoup plus jolie?
- par beau vous dire point de vue syntaxique ou algorithmiquement?
InformationsquelleAutor user249228 | 2010-01-12
Vous devez vous connecter pour publier un commentaire.
Voir les docs pour la
setdefault()
méthode:Vous pouvez l'utiliser comme un simple coup de téléphone qui vous permettra d'obtenir b, si elle existe, ou de b d'une liste vide si elle n'existe pas déjà - et de toute façon, le retour de b:
Combiner cela avec un simple "non" vérifier et vous avez fait ce que vous êtes après, en trois lignes:
defaultdict
est un peu plus agréable quesetdefault
, en supposant que vous avez Python 2.5 ou supérieur.set()
est sympa mais n'est pas intégrée dans jusqu'à 2.4. Pourquoi votre Python si vieux? 🙁defaultdict
exige également des additionnels à l'importation decollections
En supposant que vous n'êtes pas vraiment liée à des listes, defaultdict et ensemble sont tout à fait à portée de main.
Si vous vraiment voulez listes au lieu de jeux, vous pouvez suivre cela avec une
Et si vous vraiment voulez une dict à la place d'un defaultdict, vous pouvez dire
Je ne vois pas vraiment une raison quelconque vous voulez, si.
defaultdict
, parce que c'est vraiment le plus Pythonic solution.Utilisation des collections.defaultdict
set
au lieu delist
.defaultict(list)
est droit. Si "il" désigne chaque élément dans l'ensemble, puisdefaultdict(set)
est droit. Et quand "il" pleut, qu'est-ce que "il" lié au alors?set
pourrait faire plus de sens qu'unlist
.Au lieu d'utiliser un
if
, autant que je sache, il est plus pythonic d'utiliser untry
bloc à la place.vous pouvez trier vos tuples O(n log n) puis de créer votre dictionnaire O(n)
ou de plus simple O(n), mais il pourrait imposer une lourde charge sur la mémoire en cas de nombre de tuples:
Hmm c'est à peu près le même que celui que vous avez décrit. Ce qui est délicat à ce sujet?
Vous pourriez aussi envisager d'utiliser une base de données sql pour faire le sale travail.
Je ne suis pas sûr de savoir comment vous allez sortir de la touche de test, mais une fois qu'ils paire clé/valeur a été initialisé, c'est facile 🙂
Le jeu de sorte que seulement 1 de 'a' est dans la collection. Vous avez besoin de faire l'initiale " b " vérifier si assurez-vous que la clé/valeur.
Dict
get
méthode?Elle renvoie la valeur de
my_dict[some_key]
sisome_key
est dans le dictionnaire, et si ce n'est pas certains retours valeur par défaut ([]
dans l'exemple ci-dessous):Il y a une autre manière plutôt efficace (mais peut-être pas aussi efficaces que les ensembles) et simple. Il est semblable dans la pratique de
defaultdict
mais ne nécessite pas d'importation supplémentaires.Acquis que vous avez une dict à vide (Aucun) les touches, cela signifie que vous devez également créer le dict clés quelque part. Vous pouvez le faire avec le
dict.fromkeys
méthode, et cette méthode permet également de fixer la valeur par défaut pour toutes les touches.où
result
sera:{'cle1': [], 'cle2': []}
Alors vous pouvez faire votre boucle et l'utilisation
result['key1'].append(..)
directement