-2
votes

Créer un dictionnaire des listes avec condition

Voici ce que j'ai:

keys = ['name', 'port', 'target_port']
ports = [{**dict.fromkeys(keys[1:], port), "name": str(port)}
         for port in ports]


5 commentaires

Ports ["Nom"] = STR (Ports ["Nom"])


Voyant comment c'est -3, quelqu'un peut-il expliquer ce qui ne va pas avec cette question légitime?


Je suppose que les votes bas sont parce que vous n'avez pas essayé de solution. La modification d'une donnée d'entier à la chaîne est une opération simple. Votre solution peut ne pas avoir été jolie, mais elle est souvent avantageuse de demander "Comment puis-je le faire dans une seule déclaration?", Plutôt que "Comment puis-je faire cela du tout?"


J'ai fait, j'ai même montré ma solution actuelle, je cherche juste quelque chose de nettoyant. personne ne lit la question? :)


Tous ces minus sont plutôt découragés pour les personnes qui posent des questions valables.


4 Réponses :


4
votes

vous pouvez faire:

[{'target_port': 1111, 'name': '1111', 'port': 1111}, {'target_port': 2222, 'name': '2222', 'port': 2222}, {'target_port': 3333, 'name': '3333', 'port': 3333}]


11 commentaires

Désolé, c'est un peu trop intelligent pour moi, que fait ** dict.fromkeys ()?


Cette solution est excellente, mais si 'nom' déplace la position ou les touches sont plus longues, il serait plus complexe à l'échelle. ** dict.fromkeys () déballe essentiellement le dictionnaire.


@ 4C74356B41 Comme l'a dit Idlehands, il décompresse le dictionnaire une manière dont il peut être combiné à l'intérieur d'un dictionnaire littéral.


Puis-je renverser: clés [1:], str (port) et assurez-vous simplement que le nom est toujours d'abord?


Ensuite, faites {"nom": str (port), ** dict.fromkeys (touches [: 2], port)} à la place. Note Ordonnance d'insertion ne comporte que si votre version Python est de 3,6+


@ 4C74356B41 Rappelez-vous simplement que la commande n'est garantie que dans Python 3.6+


@Daniel Mesejo Si vous allez descendre cette route, pourquoi pas simplement faire: [{"port": port, "cible_port": port, "nom": str (port)} pour le port dans les ports] ?


@ekhumoro qui pourrait aussi être une option.


@ekhumoro Parce que si les touches changent, ce code n'est plus valide et doit être réécrit pour tenir compte des nouvelles clés.


@Greenloakguy Si la ou les touches (s) ou ses modifications de position (leur), ce code devra également être réécrit.


@Greencloakguy Il ne fait aucune différence si les clés sont spécifiées direcly dans la liste de la liste ou dans une liste séparée, aussi longtemps qu'ils ne sont spécifiés que une fois . En fait, ma solution évite de spécifier le "nom" deux fois, ce qui est une nouvelle amélioration.



3
votes

au lieu de faire dict.fromkeys () , vous pouvez simplement l'écrire, niché une compréhension dict à l'intérieur de la compréhension de la liste: xxx


0 commentaires

1
votes

Daniel Mesejo a donné une belle solution, mais pour une petite capacité d'échelle peu, vous pouvez définir votre propre fonction à utiliser dans une compréhension dictionnaire: xxx

Ceci vous permet de passer un montant arbitraire de str_keys dans votre fonction et la touche peut être dans n'importe quelle position.


0 commentaires

0
votes

Vous devriez être capable de le faire en utilisant ci-dessous

[{key: str(port) if key=="name" else port for key in keys} for port in ports]


1 commentaires

Cette solution a déjà reçu .