3 votes

Convertir une liste de tuples en dictionnaire de 2 manières différentes

J'ai la liste suivante de tuples.

[('0', 'Hadoop'), ('0', 'Big Data'), ('0', 'HBas'), ('0', 'Java'), ('0', 'Spark'), ('0', 'Storm'), ('0', 'Cassandra'), ('1', 'NoSQL'), ('1', 'MongoDB'), ('1', 'Cassandra'), ('1', 'HBase'), ('1', 'Postgres'), ('2', 'Python'), ('2', 'skikit-learn'), ('2', 'scipy'), ('2', 'numpy'), ('2', 'statsmodels'), ('2', 'pandas'), ('3', 'R'), ('3', 'Python'), ('3', 'statistics'), ('3', 'regression'), ('3', 'probability'), ('4', 'machine learning'), ('4', 'regression'), ('4', 'decision trees'), ('4', 'libsvm'), ('5', 'Python'), ('5', 'R'), ('5', 'Java'), ('5', 'C++'), ('5', 'Haskell'), ('5', 'programming languages'), ('6', 'statistics'), ('6', 'probability'), ('6', 'mathematics'), ('6', 'theory'), ('7', 'machine learning'), ('7', 'scikit-learn'), ('7', 'Mahout'), ('7', 'neural networks'), ('8', 'neural networks'), ('8', 'deep learning'), ('8', 'Big Data'), ('8', 'artificial intelligence'), ('9', 'Hadoop'), ('9', 'Java'), ('9', 'MapReduce'), ('9', 'Big Data')]

Les valeurs de gauche sont les "numéros d'identification des employés", tandis que les valeurs de droite sont les "intérêts". Je dois transformer ces valeurs en dictionnaires de deux manières différentes : Je dois faire du numéro d'identification de l'employé la clé et des intérêts la valeur, puis je dois faire des intérêts la clé et du numéro d'identification de l'employé la valeur. Pour donner un exemple rapide, j'ai besoin qu'un des éléments de mon résultat final ressemble à ceci :

{'0': ['Hadoop', 'Big Data', 'HBas', 'Java', 'Spark', 'Storm', 'Cassandra'],
 '1' ... etc]}

Alors le suivant ressemblerait à ceci :

{'Hadoop': [0,9]...}

J'ai essayé la dictée par défaut mais je n'ai pas réussi à la faire fonctionner. Avez-vous des suggestions ?

0voto

Jaba Points 3963

Vous pouvez également le faire en utilisant un set y dict compréhension.

data = [('0', 'Hadoop'),
('0', 'Big Data'),
('0', 'HBas'),
('0', 'Java'),
...]

ids = {id_[0] for id_ in data}
d = {id_: [intrest[1] for intrest in data if intrest[0] == id_] for id_ in ids}

Cela se traduit par :

{'9': ['Hadoop', 'Java', 'MapReduce', 'Big Data'], '8': ['neural networks', 'deep learning', 'Big Data', 'artificial intelligence'], '6': ['statistics', 'probability', 'mathematics', 'theory'], '3': ['R', 'Python', 'statistics', 'regression', 'probability'], '2': ['Python', 'skikit-learn', 'scipy', 'numpy', 'statsmodels', 'pandas'], '5':['Python', 'R', 'Java', 'C++', 'Haskell', 'programming languages'],'4': ['machine learning', 'regression', 'decision trees', 'libsvm'], '0': ['Hadoop', 'Big Data', 'HBas', 'Java', 'Spark', 'Storm', 'Cassandra'], '1': ['NoSQL', 'MongoDB', 'Cassandra', 'HBase', 'Postgres'], '7': ['machine learning', 'scikit-learn', 'Mahout', 'neural networks']}

Editar

Ceci est plus efficace si vous utilisez itertools groupby.

from itertools import groupby
from operator import itemgetter

id_intrests = groupby(data, key=itemgetter(0))
d = {id_: [_[1] for _ in intrests] for id_, intrests in id_intrests}

0voto

Chris Points 2347

Une autre approche serait d'utiliser itertools.groupby :

import itertools

tups = [('0', 'Hadoop'),
('0', 'Big Data'),
('0', 'HBas'),
...]

{k:list(zip(*v))[1] for k, v in itertools.groupby(tups, key=lambda x:x[0])}

{'0': ('Hadoop', 'Big Data', 'HBas', 'Java', 'Spark', 'Storm', 'Cassandra'),
...
 '9': ('Hadoop', 'Java', 'MapReduce', 'Big Data')}

{k:list(zip(*v))[0] for k, v in itertools.groupby(sorted(tups, key=lambda x:x[1]), key=lambda x:x[1])}

{'Big Data': ('0', '8', '9'),
 ...
 'theory': ('6',)}

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