2
votes

Comment convertir une liste en dictionnaire où certaines clés n'ont pas leurs valeurs?

J'ai une liste d'objets avec leurs nombres associés après un point-virgule. Tentative de conversion de cette liste en dictionnaire, mais certaines clés n'auront pas leurs valeurs une fois converties. J'ai essayé d'utiliser try / except mais je ne sais pas comment stocker la valeur individuellement dans le dictionnaire.

Exemple:

for objects in t:
    try:
        dictionary = dict(objects.split(":") for objects in t)
    except:
        pass

Les objets Campaign et Country n'auraient aucune valeur lors de la conversion. Je voudrais passer ou attribuer un NaN comme valeur du dictionnaire.

J'ai essayé quelque chose comme ça, mais en vain.

t = ['Contact:10', 'Account:20','Campaign:', 'Country:', 'City:']


1 commentaires

Les valeurs doivent-elles être converties en int? Pouvez-vous montrer votre résultat attendu dict. Juste pour être clair?


4 Réponses :


10
votes

Vous n'avez pas vraiment besoin d'essayer / catch:

{ a: b if b else None for a,b in (i.split(':') for i in t) }

cela donne:

{'Account': '20', 'Campaign': '', 'City': '', 'Contact': '10', 'Country': ''}

Si vous voulez Aucun au lieu d'une chaîne vide:

t = ['Contact:10', 'Account:20','Campaign:', 'Country:', 'City:']
{ a: b for a,b in (i.split(':') for i in t) }


0 commentaires

8
votes

Vous pouvez utiliser une expression de générateur avec une division de chaque élément et transmettre la sortie au constructeur dict :

{'Contact': '10', 'Account': '20', 'Campaign': nan, 'Country': nan, 'City': nan}

Ceci renvoie:

XXX

Si vous souhaitez attribuer NaN comme valeur par défaut, vous pouvez le faire avec une compréhension de dictée à la place:

{a: b or float('nan') for i in t for a, b in (i.split(':'),)}

Ceci renvoie:

{'Contact': '10', 'Account': '20', 'Campaign': '', 'Country': '', 'City': ''}


0 commentaires

0
votes
{'Country': '', 'City': '', 'Campaign': '', 'Account': '20', 'Contact': '10'}

2 commentaires

Pourquoi if len (field)> = 1 et pas seulement la fausse vérification par rapport à une chaîne vide?


Clarté du débutant et faire une hypothèse peut-être injustifiée sur le problème réel. Révisé et modifié; Merci.



1
votes

Si la valeur est manquante, ce sera une chaîne vide

data = {}
for pair in t:
    key, value = pair.split(':')
    if value:
        data[key] = int(value) or float('nan')

Cela nous amène donc à

import string
pairs = map(string.split, t)
data = {key: int(value) or float('nan') for key, value in pairs}

Cela pourrait être nettoyé un peu avec une compréhension du dictionnaire.

data = {}
for pair in t:
    key, value = pair.split(':')
    data[key] = int(value) or float('nan')

Vous pouvez également refuser de mettre ces clés dans le dictionnaire comme ceci

>>> 'foo:'.split(':')
['foo', '']

p>


0 commentaires