0
votes

Modifier les valeurs de duplication du dictionnaire imbriqué dans les mêmes clés

J'ai une liste de dict avec la même structure xxx

ce que je veux, ce sont des clés en double du "nom du programme" qui ont la même valeur (ex: "Bulldozer" apparaissant 2x) à être renommé "bulldozer (1)", "bulldozer (2)" et ainsi de suite.


4 commentaires

Pouvez-vous partager votre tentative?


Votre entrée est-elle correcte? Comment une liste peut avoir une paire de valeur clé?


Est-ce que la commande est importante?


@jizhihaosama il ne fait pas


4 Réponses :


0
votes

J'espère que cela aide: xxx

rendements: xxx


0 commentaires

0
votes

Vous pouvez essayer cela aussi: xxx

Approche: 01 xxx

02 xxx

sortie: xxx

Je vous recommanderais d'utiliser pandas (approche 01 ) si vous avez une énorme quantité de données.


2 commentaires

Bulldozer n'est qu'un exemple de la liste contient 10 000 dict et beaucoup de noms de programme différents


Bien que l'approche 2 est très similaire à la réponse @jizhihaosama.



2
votes

Un moyen efficace est d'utiliser defaultDict pour compter le "nom du programme" , la complexité temporelle est o (n) : xxx

résultat: xxx


4 commentaires

Semble se séparer de noms avec des espaces comme si j'ai un nom de programme avec "Bulldozer Rambo", il démarrera Collectiong le nom de Bulldozer par son propre nom et non l'ensemble du nom "Bulldozer Rambo". Corrigé en retirant la division () [0]


@Crapy Si oui. Vous pouvez utiliser TMP ["" .Join (i "[nom du programme»]. Split () [: - 1])] + = 1 ou regex pour les diviser.


@Crapy Si vous supprimez le Split , le nom complet "xxx (1)" sera ajouté dans le TMP ce que vous voulez .Vous pouvez utiliser l'impression (TMP) pour le voir. Ce sera un comportement inattendu lorsqu'il y a trois ou plusieurs duplicataires "Nom du programme" .


J'ai essayé votre solution avec la division () [: - 1] mais il semble ne pas bien fonctionner pour des noms compliqués tels que Bulldozer Mega (Q7-4), par exemple



0
votes

Merci à @jizhihaosama, j'ai réussi à trouver une solution à mon problème avec une petite modification

machines = [{"Program Name": "Bulldozer", "Level": 3}, {"Program Name": "Robot", "Level": 1}, {"Program Name": "Bulldozer", "Level": 4}]
        tmp = defaultdict(int)
        for i in machines:
            name = i["Program Name"].strip(f' ({tmp[i["Program Name"]]})')
            i["Program Name"] = f'{name} ({tmp[i["Program Name"]]})' if tmp[name] else i["Program Name"]
            tmp[name] += 1


0 commentaires