Voici ce que j'ai:
keys = ['name', 'port', 'target_port']
ports = [{**dict.fromkeys(keys[1:], port), "name": str(port)}
for port in ports]
4 Réponses :
vous pouvez faire:
[{'target_port': 1111, 'name': '1111', 'port': 1111}, {'target_port': 2222, 'name': '2222', 'port': 2222}, {'target_port': 3333, 'name': '3333', 'port': 3333}]
Désolé, c'est un peu trop intelligent pour moi, que fait ** dict.fromkeys ()?
Cette solution est excellente, mais si 'nom' code> déplace la position ou les touches code> sont plus longues, il serait plus complexe à l'échelle. ** dict.fromkeys () code> 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) code> et assurez-vous simplement que le nom est toujours d'abord?
Ensuite, faites {"nom": str (port), ** dict.fromkeys (touches [: 2], port)} code> à 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] code>?
@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 i>. En fait, ma solution évite de spécifier le "nom" code> deux fois, ce qui est une nouvelle amélioration.
au lieu de faire dict.fromkeys () code>, vous pouvez simplement l'écrire, niché une compréhension dict à l'intérieur de la compréhension de la liste:
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: Ceci vous permet de passer un montant arbitraire de str_keys code> dans votre fonction et la touche code> code> peut être dans n'importe quelle position. P> P>
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]
Cette solution a déjà reçu .
Ports ["Nom"] = STR (Ports ["Nom"]) CODE>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.