0
votes

Comment consolider les éléments de la liste imbriquée

J'ai écrit un script python qui analyse beaucoup de données et nettoie-le conformément à l'exemple ci-dessous:

input_list = [[a,b,c,0.5], [a,b,d,1], [a,b,e,1], [a,b,c,0.3], [a,b,c,0.2], [a,b,f,0.6], [a,b,f,0.4], [a,b,g,1]]

output_list = [[a,b,c,1], [a,b,d,1], [a,b,e,1], [a,b,f,1], [a,b,g,1]]


2 commentaires

Ce serait génial si vous pouvez inclure votre code d'origine afin que nous puissions voir ce que vous avez fait :)


Montrez votre code, puis nous nous aidons à vous améliorer et à l'obtenir plus imbriqué


5 Réponses :


4
votes
input_list = [['a','b','c',0.5], ['a','b','d',1], ['a','b','e',1], ['a','b','c',0.3], ['a','b','c',0.2], ['a','b','f',0.6], ['a','b','f',0.4], ['a','b','g',1]]
output_list = []

d = {}
for i in input_list:
    key = (i[0], i[1], i[2])
    d[key] = i[3] + (d[key] if key in d else float(0))

for k, v in d.iteritems():
    output_list.append([
        k[0], k[1], k[2], v
    ])

# print output_list

1 commentaires

Merci, c'est génial. J'avais jamais pensé à utiliser des dictionnaires pour cela, c'est donc un grand moment d'apprentissage! Merci beaucoup!



1
votes

Depuis que vous ne savez pas combien d'éléments correspondront et que vous devez garder une trace de ce que vous avez trouvé pour des clés spécifiques jusqu'à présent, à l'aide d'un dict en tant que type de données intermédiaire.

Voici une solution de travail : xxx

Qu'est-ce que cela fait:

  • boucle sur l'INPUT_LIST
  • Combinez les trois premières valeurs de chaque élément dans une touche
  • Vérifiez si la clé est dans un dictionnaire
  • Si c'est le cas, ajoutez la quatrième valeur à celle-ci, ajoutez sinon la quatrième valeur sous forme de nouvelle valeur
  • à la fin, tournez le dictionnaire dans une liste correspondant à la structure d'origine

    dans Python 3, la dernière ligne serait meilleure comme suit: xxx


0 commentaires

1
votes

Ceci est une bonne usecase de iTertools.groupby , et cela fonctionne pour les deux python2 code> et python3 code>.

Nous regroupons essentiellement tous les éléments avec les mêmes premiers éléments, résumant les 4ème éléments de tous ces groupes et crée la liste de résultats p> xxx pré>

la sortie sera p> xxx pré>

Une autre approche consiste à utiliser un dictionnaire, avec la clé étant les 3 premiers éléments de la liste et résumant les valeurs du 4ème élément P>

input_list = [['a','b','c',0.5], ['a','b','d',1], ['a','b','e',1], ['a','b','c',0.3], ['a','b','c',0.2], ['a','b','f',0.6], ['a','b','f',0.4], ['a','b','g',1]]

dct = {}

#Iterate through input list
for x,y,z, a in input_list:
    #Take the first 3 elements as the key
    k = x,y,z

    #Add up 4th value for common first 3 elements
    dct.setdefault(k,0)
    dct[k]= a+dct[k]

#Convert dictionary back to list
res = [ [x,y,z,int(v)] for (x,y,z), v in dct.items()]

print(res)


2 commentaires

Génial, heureux d'aider, s'il vous plaît uplifier ou accepter si la réponse vous a aidé @lolo :)


Merci à @lolo pour la uppote, j'ai également inclus une manière plus courte d'utiliser une approche basée sur le dictionnaire comme mise à jour de ma réponse, s'il vous plaît jeter un oeil



0
votes

Je pense avoir une réponse pour vous: xxx

sortie: xxx


0 commentaires

0
votes

Que diriez-vous de quelque chose comme ça? XXX

Vous pouvez décompresser des valeurs telles que ceci * x, y = 1,2,3,4 dans le python moderne mais je Ne pense pas que legacy python a cette fonctionnalité.


0 commentaires